From 596b3dbeeed513a1d6f945bacde9c872c25ebcd6 Mon Sep 17 00:00:00 2001 From: totolouis Date: Wed, 27 May 2020 22:51:03 -0700 Subject: [PATCH 01/66] fix: translation from HTML code to apostrophe For French translation, the apostrophe was in HTML code and thus is not displayed correctly. Issue reported a few times: https://discuss.erpnext.com/t/apostrophe-is-showed-as-39-is-not-interpreted/49954/3 and https://discuss.erpnext.com/t/mega-thread-version-12-release-bugs/50987/49. --- erpnext/translations/fr.csv | 1334 +++++++++++++++++------------------ 1 file changed, 667 insertions(+), 667 deletions(-) diff --git a/erpnext/translations/fr.csv b/erpnext/translations/fr.csv index 7960941e9eb..b0fbf37a59e 100644 --- a/erpnext/translations/fr.csv +++ b/erpnext/translations/fr.csv @@ -18,9 +18,9 @@ 90-Above,90-Dessus, A Customer Group exists with same name please change the Customer name or rename the Customer Group,"Un Groupe de Clients existe avec le même nom, veuillez changer le nom du Client ou renommer le Groupe de Clients", A Default Service Level Agreement already exists.,Un accord de niveau de service par défaut existe déjà., -A Lead requires either a person's name or an organization's name,Un responsable requiert le nom d'une personne ou le nom d'une organisation, +A Lead requires either a person's name or an organization's name,Un responsable requiert le nom d'une personne ou le nom d'une organisation, A customer with the same name already exists,Un client avec un nom identique existe déjà, -A question must have more than one options,Une question doit avoir plus d'une option, +A question must have more than one options,Une question doit avoir plus d'une option, A qustion must have at least one correct options,Une qustion doit avoir au moins une des options correctes, A {0} exists between {1} and {2} (,Un {0} existe entre {1} et {2} (, A4,A4, @@ -30,7 +30,7 @@ Abbr can not be blank or space,Abré. ne peut être vide ou contenir un espace, Abbreviation already used for another company,Abréviation déjà utilisée pour une autre société, Abbreviation cannot have more than 5 characters,L'abbréviation ne peut pas avoir plus de 5 caractères, Abbreviation is mandatory,Abréviation est obligatoire, -About the Company,À propos de l'entreprise, +About the Company,À propos de l'entreprise, About your company,A propos de votre entreprise, Above,Au-dessus, Absent,Absent, @@ -100,7 +100,7 @@ Active,actif, Active Leads / Customers,Prospects / Clients Actifs, Activity Cost exists for Employee {0} against Activity Type - {1},Des Coûts d'Activité existent pour l'Employé {0} pour le Type d'Activité - {1}, Activity Cost per Employee,Coût de l'Activité par Employé, -Activity Type,Type d'activité, +Activity Type,Type d'activité, Actual Cost,Prix actuel, Actual Delivery Date,Date de livraison réelle, Actual Qty,Quantité Réelle, @@ -129,7 +129,7 @@ Add Timesheets,Ajouter des feuilles de temps, Add Timeslots,Ajouter des Créneaux, Add Users to Marketplace,Ajouter des utilisateurs à la Marketplace, Add a new address,ajouter une nouvelle adresse, -Add cards or custom sections on homepage,Ajouter des cartes ou des sections personnalisées sur la page d'accueil, +Add cards or custom sections on homepage,Ajouter des cartes ou des sections personnalisées sur la page d'accueil, Add more items or open full form,Ajouter plus d'articles ou ouvrir le formulaire complet, Add notes,Ajouter des notes, Add the rest of your organization as your users. You can also add invite Customers to your portal by adding them from Contacts,Ajouter le reste de votre organisation en tant qu'utilisateurs. Vous pouvez aussi inviter des Clients sur votre portail en les ajoutant depuis les Contacts, @@ -196,7 +196,7 @@ All communications including and above this shall be moved into the new Issue,"T All items have already been invoiced,Tous les articles ont déjà été facturés, All items have already been transferred for this Work Order.,Tous les articles ont déjà été transférés pour cet ordre de travail., All other ITC,Tous les autres CTI, -All the mandatory Task for employee creation hasn't been done yet.,Toutes les tâches obligatoires pour la création d'employés n'ont pas encore été effectuées., +All the mandatory Task for employee creation hasn't been done yet.,Toutes les tâches obligatoires pour la création d'employés n'ont pas encore été effectuées., All these items have already been invoiced,Tous ces articles ont déjà été facturés, Allocate Payment Amount,Allouer le montant du paiement, Allocated Amount,Montant alloué, @@ -206,7 +206,7 @@ Allow Delete,Autoriser la suppression, Already record exists for the item {0},L'enregistrement existe déjà pour l'article {0}, "Already set default in pos profile {0} for user {1}, kindly disabled default","Déjà défini par défaut dans le profil pdv {0} pour l'utilisateur {1}, veuillez désactiver la valeur par défaut", Alternate Item,Article alternatif, -Alternative item must not be same as item code,L'article alternatif ne doit pas être le même que le code article, +Alternative item must not be same as item code,L'article alternatif ne doit pas être le même que le code article, Amended From,Modifié depuis, Amount,Montant, Amount After Depreciation,Montant après amortissement, @@ -221,14 +221,14 @@ Amount {0} {1} {2} {3},Montant {0} {1} {2} {3}, Amt,Nb, "An Item Group exists with same name, please change the item name or rename the item group","Un Groupe d'Article existe avec le même nom, veuillez changer le nom de l'article ou renommer le groupe d'article", An academic term with this 'Academic Year' {0} and 'Term Name' {1} already exists. Please modify these entries and try again.,Une période universitaire avec cette 'Année Universitaire' {0} et 'Nom de la Période' {1} existe déjà. Veuillez modifier ces entrées et essayer à nouveau., -An error occurred during the update process,Une erreur s'est produite lors du processus de mise à jour, +An error occurred during the update process,Une erreur s'est produite lors du processus de mise à jour, "An item exists with same name ({0}), please change the item group name or rename the item","Un article existe avec le même nom ({0}), veuillez changer le nom du groupe d'article ou renommer l'article", Analyst,Analyste, Analytics,Analytique, Annual Billing: {0},Facturation Annuelle : {0}, Annual Salary,Salaire annuel, Anonymous,Anonyme, -Another Budget record '{0}' already exists against {1} '{2}' and account '{3}' for fiscal year {4},Un autre enregistrement Budget '{0}' existe déjà pour {1} '{2}' et pour le compte '{3}' pour l'exercice {4}., +Another Budget record '{0}' already exists against {1} '{2}' and account '{3}' for fiscal year {4},Un autre enregistrement Budget '{0}' existe déjà pour {1} '{2}' et pour le compte '{3}' pour l'exercice {4}., Another Period Closing Entry {0} has been made after {1},Une autre Entrée de Clôture de Période {0} a été faite après {1}, Another Sales Person {0} exists with the same Employee id,Un autre Commercial {0} existe avec le même ID d'Employé, Antibiotic,Antibiotique, @@ -260,11 +260,11 @@ Approving User cannot be same as user the rule is Applicable To,L'Utilisateur Ap "Apps using current key won't be able to access, are you sure?","Les applications utilisant la clé actuelle ne pourront plus y accéder, êtes-vous sûr?", Are you sure you want to cancel this appointment?,Êtes-vous sûr de vouloir annuler ce rendez-vous?, Arrear,Arriéré, -As Examiner,En tant qu'examinateur, +As Examiner,En tant qu'examinateur, As On Date,Comme à la date, As Supervisor,En tant que superviseur, As per rules 42 & 43 of CGST Rules,Conformément aux règles 42 et 43 des règles de la CGST, -As per section 17(5),Conformément à l'article 17 (5), +As per section 17(5),Conformément à l'article 17 (5), As per your assigned Salary Structure you cannot apply for benefits,La struture salariale qui vous a été assignée ne vous permet pas de demander des avantages sociaux, Assessment,Évaluation, Assessment Criteria,Critères d'Évaluation, @@ -273,7 +273,7 @@ Assessment Group: ,Groupe d'Évaluation:, Assessment Plan,Plan d'Évaluation, Assessment Plan Name,Nom du Plan d'Évaluation, Assessment Report,Rapport d'Évaluation, -Assessment Reports,Rapports d'évaluation, +Assessment Reports,Rapports d'évaluation, Assessment Result,Résultat de l'Évaluation, Assessment Result record {0} already exists.,Le Résultat d'Évaluation {0} existe déjà., Asset,Atout, @@ -329,7 +329,7 @@ Available Selling,Vente disponible, Available for use date is required,La date de mise en service est nécessaire, Available slots,Créneaux Disponibles, Available {0},Disponible {0}, -Available-for-use Date should be after purchase date,La date de disponibilité devrait être postérieure à la date d'achat, +Available-for-use Date should be after purchase date,La date de disponibilité devrait être postérieure à la date d'achat, Average Age,Âge moyen, Average Rate,Prix moyen, Avg Daily Outgoing,Moy Quotidienne Sortante, @@ -384,7 +384,7 @@ Batch Name,Nom du lot, Batch No,N° du Lot, Batch number is mandatory for Item {0},Le numéro de lot est obligatoire pour l'Article {0}, Batch {0} of Item {1} has expired.,Lot {0} de l'Article {1} a expiré., -Batch {0} of Item {1} is disabled.,Le lot {0} de l'élément {1} est désactivé., +Batch {0} of Item {1} is disabled.,Le lot {0} de l'élément {1} est désactivé., Batch: ,Lot:, Batches,Lots, Become a Seller,Devenir vendeur, @@ -399,20 +399,20 @@ Billed,Facturé, Billed Amount,Montant facturé, Billing,Facturation, Billing Address,Adresse de facturation, -Billing Address is same as Shipping Address,L'adresse de facturation est identique à l'adresse de livraison, +Billing Address is same as Shipping Address,L'adresse de facturation est identique à l'adresse de livraison, Billing Amount,Montant de Facturation, Billing Status,Statut de la Facturation, Billing currency must be equal to either default company's currency or party account currency,La devise de facturation doit être égale à la devise de la société par défaut ou à la devise du compte du partenaire, Bills raised by Suppliers.,Factures émises par des Fournisseurs., Bills raised to Customers.,Factures émises pour des Clients., Biotechnology,Biotechnologie, -Birthday Reminder,Rappel d'anniversaire, +Birthday Reminder,Rappel d'anniversaire, Black,Noir, Blanket Orders from Costumers.,Commandes provisoires de clients., Block Invoice,Bloquer la facture, Boms,Listes de Matériaux, Bonus Payment Date cannot be a past date,La date de paiement du bonus ne peut pas être une date passée, -Both Trial Period Start Date and Trial Period End Date must be set,La date de début de la période d'essai et la date de fin de la période d'essai doivent être définies, +Both Trial Period Start Date and Trial Period End Date must be set,La date de début de la période d'essai et la date de fin de la période d'essai doivent être définies, Both Warehouse must belong to same Company,Les deux Entrepôt doivent appartenir à la même Société, Branch,Branche, Broadcasting,Radio/Télévision, @@ -429,7 +429,7 @@ Business Development Manager,Directeur Commercial, Buy,Acheter, Buying,Achat, Buying Amount,Montant d'Achat, -Buying Price List,Liste de prix d'achat, +Buying Price List,Liste de prix d'achat, Buying Rate,Prix d'achat, "Buying must be checked, if Applicable For is selected as {0}","Achat doit être vérifié, si Applicable Pour {0} est sélectionné", By {0},Par {0}, @@ -447,7 +447,7 @@ Campaign,Campagne, Can be approved by {0},Peut être approuvé par {0}, "Can not filter based on Account, if grouped by Account","Impossible de filtrer sur le Compte , si les lignes sont regroupées par Compte", "Can not filter based on Voucher No, if grouped by Voucher","Impossible de filtrer sur la base du N° de Coupon, si les lignes sont regroupées par Coupon", -"Can not mark Inpatient Record Discharged, there are Unbilled Invoices {0}","Impossible de marquer le dossier d'hospitalisation déchargé, il existe des factures non facturées {0}", +"Can not mark Inpatient Record Discharged, there are Unbilled Invoices {0}","Impossible de marquer le dossier d'hospitalisation déchargé, il existe des factures non facturées {0}", Can only make payment against unbilled {0},Le paiement n'est possible qu'avec les {0} non facturés, Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total',Peut se référer à ligne seulement si le type de charge est 'Montant de la ligne précedente' ou 'Total des lignes précedente', "Can't change valuation method, as there are transactions against some items which does not have it's own valuation method","Impossible de modifier la méthode de valorisation, car il existe des transactions sur certains articles ne possèdant pas leur propre méthode de valorisation", @@ -455,17 +455,17 @@ Can't create standard criteria. Please rename the criteria,Impossible de créer Cancel,Annuler, Cancel Material Visit {0} before cancelling this Warranty Claim,Annuler la Visite Matérielle {0} avant d'annuler cette Réclamation de Garantie, Cancel Material Visits {0} before cancelling this Maintenance Visit,Annuler les Visites Matérielles {0} avant d'annuler cette Visite de Maintenance, -Cancel Subscription,Annuler l'abonnement, +Cancel Subscription,Annuler l'abonnement, Cancel the journal entry {0} first,Annuler d'abord l'écriture de journal {0}, Canceled,Annulé, "Cannot Submit, Employees left to mark attendance","Ne peut pas être soumis, certains employés n'ont pas pas validé leurs feuilles de présence", Cannot be a fixed asset item as Stock Ledger is created.,Ne peut pas être un article immobilisé car un Journal de Stock a été créé., Cannot cancel because submitted Stock Entry {0} exists,Impossible d'annuler car l'Écriture de Stock soumise {0} existe, Cannot cancel transaction for Completed Work Order.,Impossible d'annuler la transaction lorsque l'ordre de travail est terminé., -Cannot cancel {0} {1} because Serial No {2} does not belong to the warehouse {3},Impossible d'annuler {0} {1} car le numéro de série {2} n'appartient pas à l'entrepôt {3}, +Cannot cancel {0} {1} because Serial No {2} does not belong to the warehouse {3},Impossible d'annuler {0} {1} car le numéro de série {2} n'appartient pas à l'entrepôt {3}, Cannot change Attributes after stock transaction. Make a new Item and transfer stock to the new Item,Impossible de modifier les attributs après des mouvements de stock. Faites un nouvel article et transférez la quantité en stock au nouvel article, Cannot change Fiscal Year Start Date and Fiscal Year End Date once the Fiscal Year is saved.,Impossible de modifier les dates de début et de fin d'exercice une fois que l'exercice est enregistré., -Cannot change Service Stop Date for item in row {0},Impossible de modifier la date d'arrêt du service pour l'élément de la ligne {0}, +Cannot change Service Stop Date for item in row {0},Impossible de modifier la date d'arrêt du service pour l'élément de la ligne {0}, Cannot change Variant properties after stock transaction. You will have to make a new Item to do this.,Impossible de modifier les propriétés de variante après une transaction de stock. Vous devrez créer un nouvel article pour pouvoir le faire., "Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency.","Impossible de changer la devise par défaut de la société, parce qu'il y a des opérations existantes. Les transactions doivent être annulées pour changer la devise par défaut.", Cannot change status as student {0} is linked with student application {1},Impossible de changer le statut car l'étudiant {0} est lié à la candidature de l'étudiant {1}, @@ -479,7 +479,7 @@ Cannot deduct when category is for 'Valuation' or 'Valuation and Total',Déducti Cannot deduct when category is for 'Valuation' or 'Vaulation and Total',Vous ne pouvez pas déduire lorsqu'une catégorie est pour 'Évaluation' ou 'Évaluation et Total', "Cannot delete Serial No {0}, as it is used in stock transactions","Impossible de supprimer les N° de série {0}, s'ils sont dans les mouvements de stock", Cannot enroll more than {0} students for this student group.,Inscription de plus de {0} étudiants impossible pour ce groupe d'étudiants., -Cannot find Item with this barcode,Impossible de trouver l'article avec ce code à barres, +Cannot find Item with this barcode,Impossible de trouver l'article avec ce code à barres, Cannot find active Leave Period,Impossible de trouver une période de congés active, Cannot produce more Item {0} than Sales Order quantity {1},Impossible de produire plus d'Article {0} que la quantité {1} du Bon de Commande, Cannot promote Employee with status Left,"Impossible de promouvoir un employé avec le statut ""Parti""", @@ -538,7 +538,7 @@ Cheques Required,Chèques requis, Cheques and Deposits incorrectly cleared,Chèques et Dépôts incorrectement compensés, Child Item should not be a Product Bundle. Please remove item `{0}` and save,Le sous-article ne doit pas être un ensemble de produit. S'il vous plaît retirer l'article `{0}` et sauver, Child Task exists for this Task. You can not delete this Task.,Une tâche enfant existe pour cette tâche. Vous ne pouvez pas supprimer cette tâche., -Child nodes can be only created under 'Group' type nodes,Les noeuds enfants peuvent être créés uniquement dans les nœuds de type 'Groupe', +Child nodes can be only created under 'Group' type nodes,Les noeuds enfants peuvent être créés uniquement dans les nœuds de type 'Groupe', Child warehouse exists for this warehouse. You can not delete this warehouse.,Un entrepôt enfant existe pour cet entrepôt. Vous ne pouvez pas supprimer cet entrepôt., Circular Reference Error,Erreur de référence circulaire, City,Ville, @@ -578,11 +578,11 @@ Commission rate cannot be greater than 100,Taux de commission ne peut pas être Community Forum,Forum de la communauté, Company (not Customer or Supplier) master.,Données de base de la Société (ni les Clients ni les Fournisseurs), Company Abbreviation,Abréviation de la Société, -Company Abbreviation cannot have more than 5 characters,L'abréviation de l'entreprise ne peut pas comporter plus de 5 caractères, +Company Abbreviation cannot have more than 5 characters,L'abréviation de l'entreprise ne peut pas comporter plus de 5 caractères, Company Name,Nom de la Société, Company Name cannot be Company,Nom de la Société ne peut pas être Company, Company currencies of both the companies should match for Inter Company Transactions.,Les devises des deux sociétés doivent correspondre pour les transactions inter-sociétés., -Company is manadatory for company account,La société est le maître d'œuvre du compte d'entreprise, +Company is manadatory for company account,La société est le maître d'œuvre du compte d'entreprise, Company name not same,Le nom de la société n'est pas identique, Company {0} does not exist,Société {0} n'existe pas, "Company, Payment Account, From Date and To Date is mandatory","Société, compte de paiement, date de début et date de fin sont obligatoires", @@ -653,7 +653,7 @@ Could not submit some Salary Slips,Les fiches de paie n'ont pas pu être soumise Country wise default Address Templates,Modèles d'Adresse par défaut en fonction du pays, Course,Cours, Course Code: ,Code du Cours:, -Course Enrollment {0} does not exists,L'inscription au cours {0} n'existe pas, +Course Enrollment {0} does not exists,L'inscription au cours {0} n'existe pas, Course Schedule,Horaire du cours, Course: ,Cours:, Cr,Cr, @@ -677,7 +677,7 @@ Create Leads,Créer des Prospects, Create Maintenance Visit,Créer une visite de maintenance, Create Material Request,Créer une demande de matériel, Create Multiple,Créer plusieurs, -Create Opening Sales and Purchase Invoices,Créer des factures d'ouverture et des factures d'achat, +Create Opening Sales and Purchase Invoices,Créer des factures d'ouverture et des factures d'achat, Create Payment Entries,Créer des entrées de paiement, Create Payment Entry,Créer une entrée de paiement, Create Print Format,Créer Format d'Impression, @@ -691,7 +691,7 @@ Create Sales Order,Créer une commande client, Create Sales Orders to help you plan your work and deliver on-time,Créez des commandes pour vous aider à planifier votre travail et à livrer à temps, Create Sample Retention Stock Entry,Créer un échantillon de stock de rétention, Create Student,Créer un étudiant, -Create Student Batch,Créer un lot d'étudiants, +Create Student Batch,Créer un lot d'étudiants, Create Student Groups,Créer des Groupes d'Étudiants, Create Supplier Quotation,Créer une offre fournisseur, Create Tax Template,Créer un modèle de taxe, @@ -706,11 +706,11 @@ Create customer quotes,Créer les devis client, Create rules to restrict transactions based on values.,Créer des règles pour restreindre les transactions basées sur les valeurs ., Created By,Établi par, Created {0} scorecards for {1} between: ,{0} fiches d'évaluations créées pour {1} entre:, -Creating Company and Importing Chart of Accounts,Création d'une société et importation d'un plan comptable, +Creating Company and Importing Chart of Accounts,Création d'une société et importation d'un plan comptable, Creating Fees,Création d'Honoraires, Creating Payment Entries......,Créer des écritures de paiement..., Creating Salary Slips...,Création des fiches de paie en cours..., -Creating student groups,Créer des groupes d'étudiants, +Creating student groups,Créer des groupes d'étudiants, Creating {0} Invoice,Création de {0} facture, Credit,Crédit, Credit ({0}),Crédit ({0}), @@ -763,7 +763,7 @@ Customer required for 'Customerwise Discount',Client requis pour appliquer une ' Customer {0} does not belong to project {1},Le Client {0} ne fait pas parti du projet {1}, Customer {0} is created.,Le client {0} est créé., Customers in Queue,Clients dans la File d'Attente, -Customize Homepage Sections,Personnaliser les sections de la page d'accueil, +Customize Homepage Sections,Personnaliser les sections de la page d'accueil, Customizing Forms,Personnalisation des formulaires, Daily Project Summary for {0},Récapitulatif quotidien du projet pour {0}, Daily Reminders,Rappels quotidiens, @@ -817,7 +817,7 @@ Del,Supp, Delay in payment (Days),Retard de paiement (jours), Delete all the Transactions for this Company,Supprimer toutes les transactions pour cette société, Delete permanently?,Supprimer définitivement ?, -Deletion is not permitted for country {0},La suppression n'est pas autorisée pour le pays {0}, +Deletion is not permitted for country {0},La suppression n'est pas autorisée pour le pays {0}, Delivered,Livré, Delivered Amount,Montant Livré, Delivered Qty,Qté Livrée, @@ -842,13 +842,13 @@ Depreciation Eliminated due to disposal of assets,Amortissement Eliminé en rais Depreciation Entry,Ecriture d’Amortissement, Depreciation Method,Méthode d'Amortissement, Depreciation Row {0}: Depreciation Start Date is entered as past date,Ligne de d'amortissement {0}: La date de début de l'amortissement est dans le passé, -Depreciation Row {0}: Expected value after useful life must be greater than or equal to {1},Ligne d'amortissement {0}: la valeur attendue après la durée de vie utile doit être supérieure ou égale à {1}, +Depreciation Row {0}: Expected value after useful life must be greater than or equal to {1},Ligne d'amortissement {0}: la valeur attendue après la durée de vie utile doit être supérieure ou égale à {1}, Depreciation Row {0}: Next Depreciation Date cannot be before Available-for-use Date,Ligne d'amortissement {0}: La date d'amortissement suivante ne peut pas être antérieure à la date de mise en service, -Depreciation Row {0}: Next Depreciation Date cannot be before Purchase Date,Ligne d'amortissement {0}: la date d'amortissement suivante ne peut pas être antérieure à la date d'achat, +Depreciation Row {0}: Next Depreciation Date cannot be before Purchase Date,Ligne d'amortissement {0}: la date d'amortissement suivante ne peut pas être antérieure à la date d'achat, Designer,Designer, Detailed Reason,Raison détaillée, Details,Détails, -Details of Outward Supplies and inward supplies liable to reverse charge,Détails des livraisons sortantes et des livraisons entrantes susceptibles d'inverser la charge, +Details of Outward Supplies and inward supplies liable to reverse charge,Détails des livraisons sortantes et des livraisons entrantes susceptibles d'inverser la charge, Details of the operations carried out.,Détails des opérations effectuées., Diagnosis,Diagnostique, Did not find any item called {0},N'a pas trouvé d'élément appelé {0}, @@ -872,7 +872,7 @@ Discount amount cannot be greater than 100%,Le montant de la réduction ne peut Discount must be less than 100,La remise doit être inférieure à 100, Diseases & Fertilizers,Maladies et engrais, Dispatch,Envoi, -Dispatch Notification,Notification d'expédition, +Dispatch Notification,Notification d'expédition, Dispatch State,Statut de l'expédition, Distance,Distance, Distribution,Distribution, @@ -900,7 +900,7 @@ Draft,Brouillon, Drop Ship,Expédition Directe, Drug,Médicament, Due / Reference Date cannot be after {0},Date d’échéance / de référence ne peut pas être après le {0}, -Due Date cannot be before Posting / Supplier Invoice Date,La date d'échéance ne peut pas être antérieure à la date de comptabilisation / facture fournisseur, +Due Date cannot be before Posting / Supplier Invoice Date,La date d'échéance ne peut pas être antérieure à la date de comptabilisation / facture fournisseur, Due Date is mandatory,La Date d’Échéance est obligatoire, Duplicate Entry. Please check Authorization Rule {0},Écriture en double. Merci de vérifier la Règle d’Autorisation {0}, Duplicate Serial No entered for Item {0},Dupliquer N° de Série pour l'Article {0}, @@ -920,7 +920,7 @@ Earnest Money,Arrhes, Earning,Revenus, Edit,modifier, Edit Publishing Details,Modifier les détails de publication, -"Edit in full page for more options like assets, serial nos, batches etc.","Modifier en pleine page pour plus d'options comme les actifs, les numéros de série, les lots, etc.", +"Edit in full page for more options like assets, serial nos, batches etc.","Modifier en pleine page pour plus d'options comme les actifs, les numéros de série, les lots, etc.", Education,Éducation, Either location or employee must be required,La localisation ou l'employé sont requis, Either target qty or target amount is mandatory,Soit la qté cible soit le montant cible est obligatoire, @@ -935,16 +935,16 @@ Email Address,Adresse électronique, Email Digest: ,Compte Rendu par Email :, Email Reminders will be sent to all parties with email contacts,Les rappels par emails seront envoyés à toutes les parties avec des contacts ayant une adresse email, Email Sent,Email envoyé, -Email Template,Modèle d'email, +Email Template,Modèle d'email, Email not found in default contact,Email non trouvé dans le contact par défaut, Email sent to supplier {0},Email envoyé au fournisseur {0}, Email sent to {0},Email envoyé à {0}, Employee,Employé, -Employee A/C Number,Numéro de l'employé, +Employee A/C Number,Numéro de l'employé, Employee Advances,Avances versées aux employés, Employee Benefits,Avantages de l'Employé, Employee Grade,Echelon des employés, -Employee ID,Numéro d'employé, +Employee ID,Numéro d'employé, Employee Lifecycle,Cycle de vie des employés, Employee Name,Nom de l'Employé, Employee Promotion cannot be submitted before Promotion Date ,La promotion ne peut être soumise avant la date de promotion, @@ -952,9 +952,9 @@ Employee Referral,Recommandations, Employee Transfer cannot be submitted before Transfer Date ,Le transfert ne peut pas être soumis avant la date de transfert, Employee cannot report to himself.,L'employé ne peut pas rendre de compte à lui-même., Employee relieved on {0} must be set as 'Left',Employé dégagé de {0} doit être défini comme 'Gauche', -Employee status cannot be set to 'Left' as following employees are currently reporting to this employee: ,Le statut d'employé ne peut pas être défini sur 'Gauche' car les employés suivants sont actuellement rattachés à cet employé:, +Employee status cannot be set to 'Left' as following employees are currently reporting to this employee: ,Le statut d'employé ne peut pas être défini sur 'Gauche' car les employés suivants sont actuellement rattachés à cet employé:, Employee {0} already submited an apllication {1} for the payroll period {2},L'employé {0} a déjà envoyé une demande {1} pour la période de calcul de paie {2}, -Employee {0} has already applied for {1} between {2} and {3} : ,L'employé {0} a déjà postulé pour {1} entre {2} et {3}:, +Employee {0} has already applied for {1} between {2} and {3} : ,L'employé {0} a déjà postulé pour {1} entre {2} et {3}:, Employee {0} has already applied for {1} on {2} : ,L'employé {0} a déjà postulé pour {1} le {2}:, Employee {0} has no maximum benefit amount,L'employé {0} n'a pas de montant maximal d'avantages sociaux, Employee {0} is not active or does not exist,"L'employé {0} n'est pas actif, ou n'existe pas", @@ -971,7 +971,7 @@ End Date cannot be before Start Date.,La date de fin ne peut pas être antérieu End Year,Année de Fin, End Year cannot be before Start Year,L'Année de Fin ne peut pas être avant l'Année de Début, End on,Termine le, -End time cannot be before start time,L'heure de fin ne peut pas être avant l'heure de début, +End time cannot be before start time,L'heure de fin ne peut pas être avant l'heure de début, Ends On date cannot be before Next Contact Date.,La date de fin ne peut pas être avant la prochaine date de contact, Energy,Énergie, Engineer,Ingénieur, @@ -1021,7 +1021,7 @@ Expense Claims,Notes de Frais, Expense account is mandatory for item {0},Compte de charge est obligatoire pour l'article {0}, Expense or Difference account is mandatory for Item {0} as it impacts overall stock value,Compte de Charge et d'Écarts est obligatoire pour objet {0} car il impacte la valeur globale des actions, Expenses,Charges, -Expenses Included In Asset Valuation,Dépenses incluses dans l'évaluation de l'actif, +Expenses Included In Asset Valuation,Dépenses incluses dans l'évaluation de l'actif, Expenses Included In Valuation,Charges Incluses dans la Valorisation, Expired Batches,Lots expirés, Expires On,Expire le, @@ -1034,7 +1034,7 @@ Extra Small,Très Petit, Fail,Échec, Failed,Échoué, Failed to create website,Échec de la création du site Web, -Failed to install presets,Échec de l'installation des préréglages, +Failed to install presets,Échec de l'installation des préréglages, Failed to login,Échec de la connexion, Failed to setup company,Échec de la configuration de la société, Failed to setup defaults,Échec de la configuration par défaut, @@ -1066,16 +1066,16 @@ Financial Statements,États financiers, Financial Year,Exercice Financier, Finish,terminer, Finished Good,Produit fini, -Finished Good Item Code,Code d'article fini, +Finished Good Item Code,Code d'article fini, Finished Goods,Produits finis, Finished Item {0} must be entered for Manufacture type entry,Le Produit Fini {0} doit être saisi pour une écriture de type Production, Finished product quantity {0} and For Quantity {1} cannot be different,La quantité de produit fini {0} et Pour la quantité {1} ne peut pas être différente, First Name,Prénom, -"Fiscal Regime is mandatory, kindly set the fiscal regime in the company {0}","Le régime fiscal est obligatoire, veuillez définir le régime fiscal de l'entreprise {0}", +"Fiscal Regime is mandatory, kindly set the fiscal regime in the company {0}","Le régime fiscal est obligatoire, veuillez définir le régime fiscal de l'entreprise {0}", Fiscal Year,Exercice fiscal, -Fiscal Year End Date should be one year after Fiscal Year Start Date,La date de fin d'exercice doit être un an après la date de début d'exercice, +Fiscal Year End Date should be one year after Fiscal Year Start Date,La date de fin d'exercice doit être un an après la date de début d'exercice, Fiscal Year Start Date and Fiscal Year End Date are already set in Fiscal Year {0},La Date de Début et la Date de Fin de l'Exercice Fiscal sont déjà définies dans l'Année Fiscale {0}, -Fiscal Year Start Date should be one year earlier than Fiscal Year End Date,La date de début d'exercice doit être un an plus tôt que la date de fin d'exercice, +Fiscal Year Start Date should be one year earlier than Fiscal Year End Date,La date de début d'exercice doit être un an plus tôt que la date de fin d'exercice, Fiscal Year {0} does not exist,Exercice Fiscal {0} n'existe pas, Fiscal Year {0} is required,Exercice Fiscal {0} est nécessaire, Fiscal Year {0} not found,Exercice Fiscal {0} introuvable, @@ -1086,8 +1086,8 @@ Fixed Assets,Actifs Immobilisés, Following Material Requests have been raised automatically based on Item's re-order level,Les Demandes de Matériel suivantes ont été créées automatiquement sur la base du niveau de réapprovisionnement de l’Article, Following accounts might be selected in GST Settings:,Les comptes suivants peuvent être sélectionnés dans les paramètres GST:, Following course schedules were created,Les horaires de cours suivants ont été créés, -Following item {0} is not marked as {1} item. You can enable them as {1} item from its Item master,L'élément suivant {0} n'est pas marqué comme élément {1}. Vous pouvez les activer en tant qu'élément {1} à partir de sa fiche article., -Following items {0} are not marked as {1} item. You can enable them as {1} item from its Item master,Les éléments suivants {0} ne sont pas marqués comme {1} élément. Vous pouvez les activer en tant qu'élément {1} à partir de sa fiche article., +Following item {0} is not marked as {1} item. You can enable them as {1} item from its Item master,L'élément suivant {0} n'est pas marqué comme élément {1}. Vous pouvez les activer en tant qu'élément {1} à partir de sa fiche article., +Following items {0} are not marked as {1} item. You can enable them as {1} item from its Item master,Les éléments suivants {0} ne sont pas marqués comme {1} élément. Vous pouvez les activer en tant qu'élément {1} à partir de sa fiche article., Food,Alimentation, "Food, Beverage & Tobacco","Alimentation, boissons et tabac", For,Pour, @@ -1099,14 +1099,14 @@ For Warehouse,Pour l’Entrepôt, For Warehouse is required before Submit,Pour l’Entrepôt est requis avant de Soumettre, "For an item {0}, quantity must be negative number","Pour l'article {0}, la quantité doit être un nombre négatif", "For an item {0}, quantity must be positive number","Pour un article {0}, la quantité doit être un nombre positif", -"For job card {0}, you can only make the 'Material Transfer for Manufacture' type stock entry","Pour la carte de travail {0}, vous pouvez uniquement saisir une entrée de stock de type "Transfert d'article pour fabrication".", +"For job card {0}, you can only make the 'Material Transfer for Manufacture' type stock entry","Pour la carte de travail {0}, vous pouvez uniquement saisir une entrée de stock de type "Transfert d'article pour fabrication".", "For row {0} in {1}. To include {2} in Item rate, rows {3} must also be included","Pour la ligne {0} dans {1}. Pour inclure {2} dans le prix de l'Article, les lignes {3} doivent également être incluses", For row {0}: Enter Planned Qty,Pour la ligne {0}: entrez la quantité planifiée, "For {0}, only credit accounts can be linked against another debit entry","Pour {0}, seuls les comptes de crédit peuvent être liés avec une autre écriture de débit", "For {0}, only debit accounts can be linked against another credit entry","Pour {0}, seuls les comptes de débit peuvent être liés avec une autre écriture de crédit", Form View,Vue de Formulaire, Forum Activity,Activité du forum, -Free item code is not selected,Le code d'article gratuit n'est pas sélectionné, +Free item code is not selected,Le code d'article gratuit n'est pas sélectionné, Freight and Forwarding Charges,Frais de Fret et d'Expédition, Frequency,Fréquence, Friday,Vendredi, @@ -1122,7 +1122,7 @@ From Date {0} cannot be after employee's relieving Date {1},La date de début {0 From Date {0} cannot be before employee's joining Date {1},La date de départ {0} ne peut pas être antérieure à la date d'arrivée de l'employé {1}, From Datetime,A partir du (Date et Heure), From Delivery Note,Du Bon de Livraison, -From Fiscal Year,À partir de l'année fiscale, +From Fiscal Year,À partir de l'année fiscale, From GSTIN,GSTIN (Origine), From Party Name,Nom du tiers (Origine), From Pin Code,Code postal (Origine), @@ -1132,7 +1132,7 @@ From State,Etat (Origine), From Time,Horaire de Début, From Time Should Be Less Than To Time,Du temps devrait être moins que du temps, From Time cannot be greater than To Time.,L’Horaire Initial ne peut pas être postérieur à l’Horaire Final, -"From a supplier under composition scheme, Exempt and Nil rated","De la part d'un fournisseur sous schéma de composition, coté Exempt et Nil", +"From a supplier under composition scheme, Exempt and Nil rated","De la part d'un fournisseur sous schéma de composition, coté Exempt et Nil", From and To dates required,Les date Du et Au sont requises, From date can not be less than employee's joining date,La date de départ ne peut être antérieure à la date d'arrivée de l'employé, From value must be less than to value in row {0},De la valeur doit être inférieure à la valeur de la ligne {0}, @@ -1184,7 +1184,7 @@ Goals cannot be empty,Les objectifs ne peuvent pas être vides, Goods In Transit,Les marchandises en transit, Goods Transferred,Marchandises transférées, Goods and Services Tax (GST India),Taxe sur les Biens et Services (GST India), -Goods are already received against the outward entry {0},Les marchandises sont déjà reçues pour l'entrée sortante {0}, +Goods are already received against the outward entry {0},Les marchandises sont déjà reçues pour l'entrée sortante {0}, Government,Gouvernement, Grand Total,Total TTC, Grant,Subvention, @@ -1229,11 +1229,11 @@ Health Care,Soins de santé, Healthcare,Santé, Healthcare (beta),Santé (beta), Healthcare Practitioner,Praticien de la santé, -Healthcare Practitioner not available on {0},Le praticien de la santé n'est pas disponible le {0}, -Healthcare Practitioner {0} not available on {1},Le praticien de la santé {0} n'est pas disponible le {1}, +Healthcare Practitioner not available on {0},Le praticien de la santé n'est pas disponible le {0}, +Healthcare Practitioner {0} not available on {1},Le praticien de la santé {0} n'est pas disponible le {1}, Healthcare Service Unit,Service de soins de santé, Healthcare Service Unit Tree,Arbre des services de soins de santé, -Healthcare Service Unit Type,Type d'unité de service de soins de santé, +Healthcare Service Unit Type,Type d'unité de service de soins de santé, Healthcare Services,Services de santé, Healthcare Settings,Paramètres de santé, Hello,Bonjour, @@ -1244,7 +1244,7 @@ Hold,Tenir, Hold Invoice,Facture en attente, Holiday,Vacances, Holiday List,Liste de vacances, -Hotel Rooms of type {0} are unavailable on {1},Les chambres d'hôtel de type {0} sont indisponibles le {1}, +Hotel Rooms of type {0} are unavailable on {1},Les chambres d'hôtel de type {0} sont indisponibles le {1}, Hotels,Hôtels, Hourly,Horaire, Hours,Heures, @@ -1272,7 +1272,7 @@ Ignore Existing Ordered Qty,Ignorer la quantité commandée existante, Image,Image, Image View,Voir l'Image, Import Data,Importer des données, -Import Day Book Data,Données du journal d'importation, +Import Day Book Data,Données du journal d'importation, Import Log,Journal d'import, Import Master Data,Importer des données de base, Import Successfull,Importation réussie, @@ -1308,14 +1308,14 @@ Indirect Income,Revenu indirect, Individual,Individuel, Ineligible ITC,CTI non éligible, Initiated,Initié, -Inpatient Record,Dossier d'hospitalisation, +Inpatient Record,Dossier d'hospitalisation, Insert,Insérer, Installation Note,Note d'Installation, Installation Note {0} has already been submitted,Note d'Installation {0} à déjà été sousmise, Installation date cannot be before delivery date for Item {0},Date d'installation ne peut pas être avant la date de livraison pour l'Article {0}, Installing presets,Installation des réglages, Institute Abbreviation,Abréviation de l'Institut, -Institute Name,Nom de l'Institut, +Institute Name,Nom de l'Institut, Instructor,Instructeur, Insufficient Stock,Stock insuffisant, Insurance Start date should be less than Insurance End date,Date de Début d'Assurance devrait être antérieure à la Date de Fin d'Assurance, @@ -1331,8 +1331,8 @@ Invalid Attribute,Attribut invalide, Invalid Blanket Order for the selected Customer and Item,Commande avec limites non valide pour le client et l'article sélectionnés, Invalid Company for Inter Company Transaction.,Société non valide pour une transaction inter-sociétés., Invalid GSTIN! A GSTIN must have 15 characters.,GSTIN invalide! Un GSTIN doit comporter 15 caractères., -Invalid GSTIN! First 2 digits of GSTIN should match with State number {0}.,GSTIN invalide! Les deux premiers chiffres de GSTIN doivent correspondre au numéro d'état {0}., -Invalid GSTIN! The input you've entered doesn't match the format of GSTIN.,GSTIN invalide! L'entrée que vous avez entrée ne correspond pas au format de GSTIN., +Invalid GSTIN! First 2 digits of GSTIN should match with State number {0}.,GSTIN invalide! Les deux premiers chiffres de GSTIN doivent correspondre au numéro d'état {0}., +Invalid GSTIN! The input you've entered doesn't match the format of GSTIN.,GSTIN invalide! L'entrée que vous avez entrée ne correspond pas au format de GSTIN., Invalid Posting Time,Heure de publication non valide, Invalid attribute {0} {1},Attribut invalide {0} {1}, Invalid quantity specified for item {0}. Quantity should be greater than 0.,Quantité spécifiée invalide pour l'élément {0}. Quantité doit être supérieur à 0., @@ -1351,12 +1351,12 @@ Invoice Posting Date,Date d’Envois de la Facture, Invoice Type,Type de facture, Invoice already created for all billing hours,Facture déjà créée pour toutes les heures facturées, Invoice can't be made for zero billing hour,La facture ne peut pas être faite pour une heure facturée à zéro, -Invoice {0} no longer exists,La facture {0} n'existe plus, +Invoice {0} no longer exists,La facture {0} n'existe plus, Invoiced,Facturé, Invoiced Amount,Montant facturé, Invoices,Factures, Invoices for Costumers.,Factures pour les clients., -Inward Supplies(liable to reverse charge,Approvisionnement entrant (susceptible d'inverser la charge, +Inward Supplies(liable to reverse charge,Approvisionnement entrant (susceptible d'inverser la charge, Inward supplies from ISD,Approvisionnement entrant de la DSI, Inward supplies liable to reverse charge (other than 1 & 2 above),Approvisionnements entrants susceptibles d’être dédouanés (autres que 1 et 2 ci-dessus), Is Active,Est Active, @@ -1383,17 +1383,17 @@ Item Description,Description de l'Article, Item Group,Groupe d'Article, Item Group Tree,Arborescence de Groupe d'Article, Item Group not mentioned in item master for item {0},Le Groupe d'Articles n'est pas mentionné dans la fiche de l'article pour l'article {0}, -Item Name,Nom de l'article, +Item Name,Nom de l'article, Item Price added for {0} in Price List {1},Prix de l'Article ajouté pour {0} dans la Liste de Prix {1}, -"Item Price appears multiple times based on Price List, Supplier/Customer, Currency, Item, UOM, Qty and Dates.","Le prix de l'article apparaît plusieurs fois en fonction de la liste de prix, du fournisseur / client, de la devise, de l'article, de l'unité de mesure, de la quantité et des dates.", +"Item Price appears multiple times based on Price List, Supplier/Customer, Currency, Item, UOM, Qty and Dates.","Le prix de l'article apparaît plusieurs fois en fonction de la liste de prix, du fournisseur / client, de la devise, de l'article, de l'unité de mesure, de la quantité et des dates.", Item Price updated for {0} in Price List {1},Prix de l'Article mis à jour pour {0} dans la Liste des Prix {1}, -Item Row {0}: {1} {2} does not exist in above '{1}' table,Ligne d'objet {0}: {1} {2} n'existe pas dans la table '{1}' ci-dessus, +Item Row {0}: {1} {2} does not exist in above '{1}' table,Ligne d'objet {0}: {1} {2} n'existe pas dans la table '{1}' ci-dessus, Item Tax Row {0} must have account of type Tax or Income or Expense or Chargeable,La Ligne de Taxe d'Article {0} doit indiquer un compte de type Taxes ou Produit ou Charge ou Facturable, -Item Template,Modèle d'article, +Item Template,Modèle d'article, Item Variant Settings,Paramètres de Variante d'Article, Item Variant {0} already exists with same attributes,La Variante de l'Article {0} existe déjà avec les mêmes caractéristiques, Item Variants,Variantes de l'Article, -Item Variants updated,Variantes d'article mises à jour, +Item Variants updated,Variantes d'article mises à jour, Item has variants.,L'article a des variantes., Item must be added using 'Get Items from Purchase Receipts' button,L'article doit être ajouté à l'aide du bouton 'Obtenir des éléments de Reçus d'Achat', Item or Warehouse for row {0} does not match Material Request,L'Article ou l'Entrepôt pour la ligne {0} ne correspond pas avec la Requête de Matériel, @@ -1422,12 +1422,12 @@ Item {0} not found in 'Raw Materials Supplied' table in Purchase Order {1},Artic Item {0}: Ordered qty {1} cannot be less than minimum order qty {2} (defined in Item).,L'article {0} : Qté commandée {1} ne peut pas être inférieure à la qté de commande minimum {2} (défini dans l'Article)., Item: {0} does not exist in the system,Article : {0} n'existe pas dans le système, Items,Articles, -Items Filter,Filtre d'articles, +Items Filter,Filtre d'articles, Items and Pricing,Articles et prix, Items for Raw Material Request,Articles pour demande de matière première, Job Card,Carte de travail, Job Description,Description de l'Emploi, -Job Offer,Offre d'emploi, +Job Offer,Offre d'emploi, Job card {0} created,Job card {0} créée, Jobs,Emplois, Join,Joindre, @@ -1455,7 +1455,7 @@ Last Communication Date,Date de la Dernière Communication, Last Name,Nom de famille, Last Order Amount,Montant de la Dernière Commande, Last Order Date,Date de la dernière commande, -Last Purchase Price,Dernier prix d'achat, +Last Purchase Price,Dernier prix d'achat, Last Purchase Rate,Dernier Prix d'Achat, Latest,Dernier, Latest price updated in all BOMs,Prix les plus récents mis à jour dans toutes les LDMs, @@ -1479,7 +1479,7 @@ Leave Type {0} cannot be carry-forwarded,Le Type de Congé {0} ne peut pas être Leave Type {0} is not encashable,Le type de congé {0} n'est pas encaissable, Leave Without Pay,Congé Sans Solde, Leave and Attendance,Congés et Présences, -Leave application {0} already exists against the student {1},Laisser l'application {0} existe déjà pour l'étudiant {1}, +Leave application {0} already exists against the student {1},Laisser l'application {0} existe déjà pour l'étudiant {1}, "Leave cannot be allocated before {0}, as leave balance has already been carry-forwarded in the future leave allocation record {1}","Congé ne peut être alloué avant le {0}, car le solde de congés a déjà été reporté dans la feuille d'allocation de congés futurs {1}", "Leave cannot be applied/cancelled before {0}, as leave balance has already been carry-forwarded in the future leave allocation record {1}","Congé ne peut être demandé / annulé avant le {0}, car le solde de congés a déjà été reporté dans la feuille d'allocation de congés futurs {1}", Leave of type {0} cannot be longer than {1},Les Congés de type {0} ne peuvent pas être plus long que {1}, @@ -1543,7 +1543,7 @@ Maintenance Visit {0} must be cancelled before cancelling this Sales Order,La Vi Maintenance start date can not be before delivery date for Serial No {0},La date de début d'entretien ne peut pas être antérieure à la date de livraison pour le N° de Série {0}, Make,Faire, Make Payment,Faire un Paiement, -Make project from a template.,Faire un projet à partir d'un modèle., +Make project from a template.,Faire un projet à partir d'un modèle., Making Stock Entries,Faire des Écritures de Stock, Male,Masculin, Manage Customer Group Tree.,Gérer l'Arborescence des Groupes de Clients., @@ -1593,16 +1593,16 @@ Material Request {0} submitted.,Demande de matériel {0} soumise., Material Transfer,Transfert de matériel, Material Transferred,Matériel transféré, Material to Supplier,Du Matériel au Fournisseur, -Max Exemption Amount cannot be greater than maximum exemption amount {0} of Tax Exemption Category {1},Le montant maximal de l'exemption ne peut pas dépasser le montant maximal de l'exonération {0} de la catégorie d'exonération fiscale {1}., +Max Exemption Amount cannot be greater than maximum exemption amount {0} of Tax Exemption Category {1},Le montant maximal de l'exemption ne peut pas dépasser le montant maximal de l'exonération {0} de la catégorie d'exonération fiscale {1}., Max benefits should be greater than zero to dispense benefits,Les prestations sociales maximales doivent être supérieures à zéro pour être calculées, Max discount allowed for item: {0} is {1}%,Réduction max autorisée pour l'article : {0} est de {1} %, Max: {0},Max : {0}, -Maximum Samples - {0} can be retained for Batch {1} and Item {2}.,Maximum d'échantillons - {0} peut être conservé pour le lot {1} et l'article {2}., -Maximum Samples - {0} have already been retained for Batch {1} and Item {2} in Batch {3}.,Nombre maximum d'échantillons - {0} ont déjà été conservés pour le lot {1} et l'article {2} dans le lot {3}., +Maximum Samples - {0} can be retained for Batch {1} and Item {2}.,Maximum d'échantillons - {0} peut être conservé pour le lot {1} et l'article {2}., +Maximum Samples - {0} have already been retained for Batch {1} and Item {2} in Batch {3}.,Nombre maximum d'échantillons - {0} ont déjà été conservés pour le lot {1} et l'article {2} dans le lot {3}., Maximum amount eligible for the component {0} exceeds {1},Le montant maximal éligible pour le composant {0} dépasse {1}, Maximum benefit amount of component {0} exceeds {1},La quantité maximale de prestations sociales du composant {0} dépasse {1}, Maximum benefit amount of employee {0} exceeds {1},Le montant maximal des prestations sociales de l'employé {0} dépasse {1}, -Maximum discount for Item {0} is {1}%,La remise maximale pour l'article {0} est {1}%, +Maximum discount for Item {0} is {1}%,La remise maximale pour l'article {0} est {1}%, Maximum leave allowed in the leave type {0} is {1},La durée maximale autorisée pour le type de congé {0} est {1}, Medical,Médical, Medical Code,Code médical, @@ -1616,9 +1616,9 @@ Member ID,ID du membre, Member Name,Nom de membre, Member information.,Informations sur le membre, Membership,Adhésion, -Membership Details,Détails de l'adhésion, -Membership ID,ID d'adhésion, -Membership Type,Type d'adhésion, +Membership Details,Détails de l'adhésion, +Membership ID,ID d'adhésion, +Membership Type,Type d'adhésion, Memebership Details,Détails de l'adhésion, Memebership Type Details,Détails du type d'adhésion, Merge,Fusionner, @@ -1636,8 +1636,8 @@ Min Qty can not be greater than Max Qty,Qté Min ne peut pas être supérieure Minimum Lead Age (Days),Âge Minimum du Prospect (Jours), Miscellaneous Expenses,Charges Diverses, 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 value for Password, API Key or Shopify URL","Valeur manquante pour le mot de passe, la clé API ou l'URL Shopify", +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 value for Password, API Key or Shopify URL","Valeur manquante pour le mot de passe, la clé API ou l'URL Shopify", Mode of Payment,Moyen de paiement, Mode of Payments,Mode de paiement, Mode of Transport,Mode de transport, @@ -1651,7 +1651,7 @@ Monthly Distribution,Répartition Mensuelle, Monthly Repayment Amount cannot be greater than Loan Amount,Montant du Remboursement Mensuel ne peut pas être supérieur au Montant du Prêt, More,Plus, More Information,Informations Complémentaires, -More than one selection for {0} not allowed,Plus d'une sélection pour {0} non autorisée, +More than one selection for {0} not allowed,Plus d'une sélection pour {0} non autorisée, More...,Plus..., Motion Picture & Video,Cinéma & Vidéo, Move,mouvement, @@ -1719,7 +1719,7 @@ Next,Suivant, Next Contact By cannot be same as the Lead Email Address,Prochain Contact Par ne peut être identique à l’Adresse Email du Prospect, Next Contact Date cannot be in the past,La Date de Prochain Contact ne peut pas être dans le passé, Next Steps,Prochaines étapes, -No Action,Pas d'action, +No Action,Pas d'action, No Customers yet!,Pas encore de clients!, No Data,Aucune Donnée, No Delivery Note selected for Customer {},Aucun bon de livraison sélectionné pour le client {}, @@ -1737,11 +1737,11 @@ No Permission,Aucune autorisation, No Quote,Aucun Devis, No Remarks,Aucune Remarque, No Result to submit,Aucun résultat à soumettre, -No Salary Structure assigned for Employee {0} on given date {1},Aucune structure de salaire attribuée à l'employé {0} à la date donnée {1}, +No Salary Structure assigned for Employee {0} on given date {1},Aucune structure de salaire attribuée à l'employé {0} à la date donnée {1}, No Staffing Plans found for this Designation,Aucun plan de dotation trouvé pour cette désignation, No Student Groups created.,Aucun Groupe d'Étudiants créé., No Students in,Aucun étudiant dans, -No Tax Withholding data found for the current Fiscal Year.,Aucune donnée de retenue d'impôt trouvée pour l'exercice en cours., +No Tax Withholding data found for the current Fiscal Year.,Aucune donnée de retenue d'impôt trouvée pour l'exercice en cours., No Work Orders created,Aucun ordre de travail créé, No accounting entries for the following warehouses,Pas d’écritures comptables pour les entrepôts suivants, No active or default Salary Structure found for employee {0} for the given dates,Aucune Structure de Salaire active ou par défaut trouvée pour employé {0} pour les dates données, @@ -1753,12 +1753,12 @@ No description given,Aucune Description, No employees for the mentioned criteria,Aucun employé pour les critères mentionnés, No gain or loss in the exchange rate,Aucun gain ou perte dans le taux de change, No items listed,Aucun article référencé, -No items to be received are overdue,Aucun article à recevoir n'est en retard, +No items to be received are overdue,Aucun article à recevoir n'est en retard, No material request created,Aucune demande de matériel créée, No more updates,Pas de mise à jour supplémentaire, -No of Interactions,Nombre d'interactions, -No of Shares,Nombre d'actions, -No pending Material Requests found to link for the given items.,Aucune demande de matériel en attente n'a été trouvée pour créer un lien vers les articles donnés., +No of Interactions,Nombre d'interactions, +No of Shares,Nombre d'actions, +No pending Material Requests found to link for the given items.,Aucune demande de matériel en attente n'a été trouvée pour créer un lien vers les articles donnés., No products found,Aucun produit trouvé, No products found.,Aucun produit trouvé., No record found,Aucun Enregistrement Trouvé, @@ -1769,7 +1769,7 @@ No salary slip found to submit for the above selected criteria OR salary slip al No tasks,Aucune tâche, No time sheets,Aucunes feuilles de temps, No values,Pas de valeurs, -No {0} found for Inter Company Transactions.,Aucun {0} n'a été trouvé pour les transactions inter-sociétés., +No {0} found for Inter Company Transactions.,Aucun {0} n'a été trouvé pour les transactions inter-sociétés., Non GST Inward Supplies,Fournitures entrantes non liées à la TPS, Non Profit,À But Non Lucratif, Non Profit (beta),Association (bêta), @@ -1792,7 +1792,7 @@ Not eligible for the admission in this program as per DOB,Non admissible à l'ad Not items found,Pas d'objets trouvés, Not permitted for {0},Non autorisé pour {0}, "Not permitted, configure Lab Test Template as required","Non autorisé, veuillez configurer le modèle de test de laboratoire", -Not permitted. Please disable the Service Unit Type,Pas permis. Veuillez désactiver le type d'unité de service, +Not permitted. Please disable the Service Unit Type,Pas permis. Veuillez désactiver le type d'unité de service, Note: Due / Reference Date exceeds allowed customer credit days by {0} day(s),Remarque : Date de Référence / d’Échéance dépasse le nombre de jours de crédit client autorisé de {0} jour(s), Note: Item {0} entered multiple times,Remarque : Article {0} saisi plusieurs fois, Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified,Remarque : Écriture de Paiement ne sera pas créée car le compte 'Compte Bancaire ou de Caisse' n'a pas été spécifié, @@ -1801,7 +1801,7 @@ Note: There is not enough leave balance for Leave Type {0},Remarque : Le solde d Note: This Cost Center is a Group. Cannot make accounting entries against groups.,Remarque : Ce Centre de Coûts est un Groupe. Vous ne pouvez pas faire des écritures comptables sur des groupes., Note: {0},Note : {0}, Notes,Remarques, -Nothing is included in gross,Rien n'est inclus dans le brut, +Nothing is included in gross,Rien n'est inclus dans le brut, Nothing more to show.,Rien de plus à montrer., Nothing to change,Rien à changer, Notice Period,Période de préavis, @@ -1824,8 +1824,8 @@ Online,En ligne, Online Auctions,Enchères en ligne, Only Leave Applications with status 'Approved' and 'Rejected' can be submitted,Seules les Demandes de Congés avec le statut 'Appouvée' ou 'Rejetée' peuvent être soumises, "Only the Student Applicant with the status ""Approved"" will be selected in the table below.",Seul les candidatures étudiantes avec le statut «Approuvé» seront sélectionnées dans le tableau ci-dessous., -Only users with {0} role can register on Marketplace,Seuls les utilisateurs ayant le rôle {0} peuvent s'inscrire sur Marketplace, -Only {0} in stock for item {1},Seulement {0} en stock pour l'article {1}, +Only users with {0} role can register on Marketplace,Seuls les utilisateurs ayant le rôle {0} peuvent s'inscrire sur Marketplace, +Only {0} in stock for item {1},Seulement {0} en stock pour l'article {1}, Open BOM {0},Ouvrir LDM {0}, Open Item {0},Ouvrir l'Article {0}, Open Notifications,Notifications ouvertes, @@ -1837,13 +1837,13 @@ Opening (Dr),Ouverture (Dr), Opening Accounting Balance,Solde d'Ouverture de Comptabilité, Opening Accumulated Depreciation,Amortissement Cumulé d'Ouverture, Opening Accumulated Depreciation must be less than equal to {0},Amortissement Cumulé d'Ouverture doit être inférieur ou égal à {0}, -Opening Balance,Solde d'ouverture, +Opening Balance,Solde d'ouverture, Opening Balance Equity,Ouverture de la Balance des Capitaux Propres, Opening Date and Closing Date should be within same Fiscal Year,Date d'Ouverture et Date de Clôture devraient être dans le même Exercice, Opening Date should be before Closing Date,Date d'Ouverture devrait être antérieure à la Date de Clôture, Opening Entry Journal,Ecriture de journal d'ouverture, -Opening Invoice Creation Tool,Ouverture de l'outil de création de facture, -Opening Invoice Item,Ouverture d'un poste de facture, +Opening Invoice Creation Tool,Ouverture de l'outil de création de facture, +Opening Invoice Item,Ouverture d'un poste de facture, Opening Invoices,Ouverture des factures, Opening Invoices Summary,Ouverture des factures Résumé, Opening Qty,Quantité d'Ouverture, @@ -1861,7 +1861,7 @@ Opp/Lead %,Opp / Prospect %, Opportunities,Opportunités, Opportunities by lead source,Opportunités par source de plomb, 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. Sets company's default currency, if not specified.","Optionnel. Défini la devise par défaut de l'entreprise, si non spécifié.", Optional. This setting will be used to filter in various transactions.,Facultatif. Ce paramètre sera utilisé pour filtrer différentes transactions., @@ -1925,7 +1925,7 @@ Party Type and Party is mandatory for {0} account,Le type de tiers et le tiers s Party Type is mandatory,Type de Tiers Obligatoire, Party is mandatory,Le Tiers est obligatoire, Password,Mot de passe, -Password policy for Salary Slips is not set,La politique de mot de passe pour les bulletins de salaire n'est pas définie, +Password policy for Salary Slips is not set,La politique de mot de passe pour les bulletins de salaire n'est pas définie, Past Due Date,Date d'échéance dépassée, Patient,Patient, Patient Appointment,Rendez-vous patient, @@ -1971,7 +1971,7 @@ Payments,Paiements, Payroll,Paie, Payroll Number,Numéro de paie, Payroll Payable,Paie à Payer, -Payroll date can not be less than employee's joining date,La date de paie ne peut être inférieure à la date d'adhésion de l'employé, +Payroll date can not be less than employee's joining date,La date de paie ne peut être inférieure à la date d'adhésion de l'employé, Payslip,Fiche de paie, Pending Activities,Activités en attente, Pending Amount,Montant en attente, @@ -1994,17 +1994,17 @@ Physician,Médecin, Piecework,Travail à la pièce, Pin Code,Code PIN, Pincode,Code Postal, -Place Of Supply (State/UT),Lieu d'approvisionnement (State / UT), +Place Of Supply (State/UT),Lieu d'approvisionnement (State / UT), Place Order,Passer la commande, Plan Name,Nom du plan, Plan for maintenance visits.,Plan pour les visites de maintenance., Planned Qty,Qté Planifiée, -"Planned Qty: Quantity, for which, Work Order has been raised, but is pending to be manufactured.",Qté prévue: quantité pour laquelle l'ordre de travail a été créé mais sa fabrication est en attente., +"Planned Qty: Quantity, for which, Work Order has been raised, but is pending to be manufactured.",Qté prévue: quantité pour laquelle l'ordre de travail a été créé mais sa fabrication est en attente., Planning,Planification, Plants and Machineries,Usines et Machines, Please Set Supplier Group in Buying Settings.,Veuillez définir un groupe de fournisseurs par défaut dans les paramètres d'achat., -Please add a Temporary Opening account in Chart of Accounts,Veuillez ajouter un compte d'ouverture temporaire dans le plan comptable, -Please add the account to root level Company - ,S'il vous plaît ajouter le compte au niveau racine Société -, +Please add a Temporary Opening account in Chart of Accounts,Veuillez ajouter un compte d'ouverture temporaire dans le plan comptable, +Please add the account to root level Company - ,S'il vous plaît ajouter le compte au niveau racine Société -, Please add the remaining benefits {0} to any of the existing component,Veuillez ajouter les prestations restantes {0} à l'un des composants existants, Please check Multi Currency option to allow accounts with other currency,Veuillez vérifier l'option Multi-Devises pour permettre les comptes avec une autre devise, Please click on 'Generate Schedule',"Veuillez cliquer sur ""Générer calendrier''", @@ -2013,7 +2013,7 @@ Please click on 'Generate Schedule' to get schedule,Veuillez cliquer sur ‘Gén Please confirm once you have completed your training,Veuillez confirmer une fois que vous avez terminé votre formation, Please contact to the user who have Sales Master Manager {0} role,Veuillez contactez l'utilisateur qui a le rôle de Directeur des Ventes {0}, Please create Customer from Lead {0},Veuillez créer un client à partir du prospect {0}, -Please create purchase receipt or purchase invoice for the item {0},Veuillez créer un reçu d'achat ou une facture d'achat pour l'article {0}, +Please create purchase receipt or purchase invoice for the item {0},Veuillez créer un reçu d'achat ou une facture d'achat pour l'article {0}, Please define grade for Threshold 0%,Veuillez définir une note pour le Seuil 0%, Please enable Applicable on Booking Actual Expenses,Veuillez activer l'option : Applicable sur la base de l'enregistrement des dépenses réelles, Please enable Applicable on Purchase Order and Applicable on Booking Actual Expenses,Veuillez activer les options : Applicable sur la base des bons de commande d'achat et Applicable sur la base des bons de commande d'achat, @@ -2056,11 +2056,11 @@ Please enter repayment Amount,Veuillez entrer le Montant de remboursement, Please enter valid Financial Year Start and End Dates,Veuillez entrer des Dates de Début et de Fin d’Exercice Comptable valides, Please enter valid email address,Entrez une adresse email valide, Please enter {0} first,Veuillez d’abord entrer {0}, -Please fill in all the details to generate Assessment Result.,Veuillez renseigner tous les détails pour générer le résultat de l'évaluation., +Please fill in all the details to generate Assessment Result.,Veuillez renseigner tous les détails pour générer le résultat de l'évaluation., Please identify/create Account (Group) for type - {0},Veuillez identifier / créer un compte (groupe) pour le type - {0}, Please identify/create Account (Ledger) for type - {0},Veuillez identifier / créer un compte (grand livre) pour le type - {0}, Please input all required Result Value(s),Veuillez entrer toutes les valeurs de résultat requises, -Please login as another user to register on Marketplace,Veuillez vous connecter en tant qu'autre utilisateur pour vous inscrire sur Marketplace, +Please login as another user to register on Marketplace,Veuillez vous connecter en tant qu'autre utilisateur pour vous inscrire sur Marketplace, Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone.,Veuillez vous assurer que vous voulez vraiment supprimer tous les transactions de cette société. Vos données de base resteront intactes. Cette action ne peut être annulée., Please mention Basic and HRA component in Company,Veuillez mentionner les composants Basic et HRA dans la société, Please mention Round Off Account in Company,Veuillez indiquer le Compte d’Arrondi de la Société, @@ -2085,10 +2085,10 @@ Please select Company and Designation,Veuillez sélectionner la société et la Please select Company and Party Type first,Veuillez d’abord sélectionner une Société et le Type de Tiers, Please select Company and Posting Date to getting entries,Veuillez sélectionner la société et la date de comptabilisation pour obtenir les écritures, Please select Company first,Veuillez d’abord sélectionner une Société, -Please select Completion Date for Completed Asset Maintenance Log,Veuillez sélectionner la date d'achèvement pour le journal de maintenance des actifs terminé, -Please select Completion Date for Completed Repair,Veuillez sélectionner la date d'achèvement pour la réparation terminée, +Please select Completion Date for Completed Asset Maintenance Log,Veuillez sélectionner la date d'achèvement pour le journal de maintenance des actifs terminé, +Please select Completion Date for Completed Repair,Veuillez sélectionner la date d'achèvement pour la réparation terminée, Please select Course,Veuillez sélectionner un cours, -Please select Drug,S'il vous plaît sélectionnez Drug, +Please select Drug,S'il vous plaît sélectionnez Drug, Please select Employee,Veuillez sélectionner un employé, Please select Employee Record first.,Veuillez d’abord sélectionner le Dossier de l'Employé., Please select Existing Company for creating Chart of Accounts,Veuillez sélectionner une Société Existante pour créer un Plan de Compte, @@ -2102,7 +2102,7 @@ Please select Posting Date before selecting Party,Veuillez sélectionner la Date Please select Posting Date first,Veuillez d’abord sélectionner la Date de Comptabilisation, Please select Price List,Veuillez sélectionner une Liste de Prix, Please select Program,Veuillez sélectionner un programme, -Please select Qty against item {0},Veuillez sélectionner Qté par rapport à l'élément {0}, +Please select Qty against item {0},Veuillez sélectionner Qté par rapport à l'élément {0}, Please select Sample Retention Warehouse in Stock Settings first,Veuillez d'abord définir un entrepôt de stockage des échantillons dans les paramètres de stock, Please select Start Date and End Date for Item {0},Veuillez sélectionner la Date de Début et Date de Fin pour l'Article {0}, Please select Student Admission which is mandatory for the paid student applicant,Veuillez sélectionner obligatoirement une Admission d'Étudiant pour la candidature étudiante payée, @@ -2111,7 +2111,7 @@ Please select a Batch for Item {0}. Unable to find a single batch that fulfills Please select a Company,Veuillez sélectionner une Société, Please select a batch,Veuillez sélectionner un lot, Please select a csv file,Veuillez sélectionner un fichier csv, -Please select a customer,S'il vous plaît sélectionner un client, +Please select a customer,S'il vous plaît sélectionner un client, Please select a field to edit from numpad,Veuillez sélectionner un champ à modifier sur le pavé numérique, Please select a table,Veuillez sélectionner une table, Please select a valid Date,Veuillez sélectionner une date valide, @@ -2127,7 +2127,7 @@ Please select month and year,Veuillez sélectionner le mois et l'année, Please select prefix first,Veuillez d’abord sélectionner un préfixe, Please select the Company,Veuillez sélectionner la société, Please select the Company first,Veuillez sélectionner la Société en premier, -Please select the Multiple Tier Program type for more than one collection rules.,Veuillez sélectionner le type de programme à plusieurs niveaux pour plus d'une règle de collecte., +Please select the Multiple Tier Program type for more than one collection rules.,Veuillez sélectionner le type de programme à plusieurs niveaux pour plus d'une règle de collecte., Please select the assessment group other than 'All Assessment Groups',Sélectionnez un groupe d'évaluation autre que «Tous les Groupes d'Évaluation», Please select the document type first,Veuillez d’abord sélectionner le type de document, Please select weekly off day,Veuillez sélectionnez les jours de congé hebdomadaires, @@ -2149,9 +2149,9 @@ Please set Number of Depreciations Booked,Veuillez définir le Nombre d’Amorti Please set Unrealized Exchange Gain/Loss Account in Company {0},Veuillez définir un compte de gain / perte de change non réalisé pour la société {0}, Please set User ID field in an Employee record to set Employee Role,Veuillez définir le champ ID de l'Utilisateur dans un dossier Employé pour définir le Rôle de l’Employés, Please set a default Holiday List for Employee {0} or Company {1},Veuillez définir une Liste de Vacances par défaut pour l'Employé {0} ou la Société {1}, -Please set account in Warehouse {0},Veuillez définir un compte dans l'entrepôt {0}, +Please set account in Warehouse {0},Veuillez définir un compte dans l'entrepôt {0}, Please set an active menu for Restaurant {0},Veuillez définir un menu actif pour le restaurant {0}, -Please set associated account in Tax Withholding Category {0} against Company {1},Veuillez définir le compte associé dans la catégorie de retenue d'impôt {0} contre la société {1}., +Please set associated account in Tax Withholding Category {0} against Company {1},Veuillez définir le compte associé dans la catégorie de retenue d'impôt {0} contre la société {1}., Please set at least one row in the Taxes and Charges Table,Veuillez définir au moins une ligne dans le tableau des taxes et des frais., Please set default Cash or Bank account in Mode of Payment {0},Veuillez définir un compte de Caisse ou de Banque par défaut pour le Mode de Paiement {0}, Please set default account in Salary Component {0},Veuillez définir le compte par défaut dans la Composante Salariale {0}, @@ -2161,17 +2161,17 @@ Please set default template for Leave Approval Notification in HR Settings.,Veui Please set default template for Leave Status Notification in HR Settings.,Veuillez définir un modèle par défaut pour la notification de statut de congés dans les paramètres RH., Please set default {0} in Company {1},Veuillez définir {0} par défaut dans la Société {1}, Please set filter based on Item or Warehouse,Veuillez définir un filtre basé sur l'Article ou l'Entrepôt, -Please set leave policy for employee {0} in Employee / Grade record,Veuillez définir la politique de congé pour l'employé {0} dans le dossier Employé / Grade, +Please set leave policy for employee {0} in Employee / Grade record,Veuillez définir la politique de congé pour l'employé {0} dans le dossier Employé / Grade, Please set recurring after saving,Veuillez définir la récurrence après avoir sauvegardé, Please set the Company,Veuillez définir la Société, -Please set the Customer Address,Veuillez définir l'adresse du client, +Please set the Customer Address,Veuillez définir l'adresse du client, Please set the Date Of Joining for employee {0},Veuillez définir la Date d'Embauche pour l'employé {0}, Please set the Default Cost Center in {0} company.,Veuillez définir un centre de coûts par défaut pour la société {0}., Please set the Email ID for the Student to send the Payment Request,Configurez l'ID de courrier électronique pour que l'Élève envoie la Demande de Paiement, Please set the Item Code first,Veuillez définir le Code d'Article en premier, Please set the Payment Schedule,Veuillez définir le calendrier de paiement, Please set the series to be used.,Veuillez définir la série à utiliser., -Please set {0} for address {1},Définissez {0} pour l'adresse {1}., +Please set {0} for address {1},Définissez {0} pour l'adresse {1}., Please setup Students under Student Groups,Veuillez configurer les Étudiants sous des groupes d'Étudiants, Please share your feedback to the training by clicking on 'Training Feedback' and then 'New',"Partagez vos commentaires sur la formation en cliquant sur 'Retour d'Expérience de la formation', puis 'Nouveau'", Please specify Company,Veuillez spécifier la Société, @@ -2227,13 +2227,13 @@ Pricing Rule,Règle de tarification, Pricing Rule {0} is updated,La règle de tarification {0} est mise à jour, Pricing Rules are further filtered based on quantity.,Les Règles de Tarification sont d'avantage filtrés en fonction de la quantité., Primary,Primaire, -Primary Address Details,Détails de l'adresse principale, +Primary Address Details,Détails de l'adresse principale, Primary Contact Details,Détails du contact principal, Principal Amount,Montant Principal, -Print Format,Format d'impression, +Print Format,Format d'impression, Print IRS 1099 Forms,Imprimer les formulaires IRS 1099, Print Report Card,Imprimer le rapport, -Print Settings,Paramètres d'impression, +Print Settings,Paramètres d'impression, Print and Stationery,Impression et Papeterie, Print settings updated in respective print format,Paramètres d'impression mis à jour avec le format d'impression indiqué, Print taxes with zero amount,Impression de taxes avec un montant nul, @@ -2261,7 +2261,7 @@ Profit and Loss,Pertes et Profits, Profit for the year,Bénéfice de l'exercice, Program,Programme, Program in the Fee Structure and Student Group {0} are different.,Le programme dans la structure d'honoraires et le groupe d'étudiants {0} sont différents., -Program {0} does not exist.,Le programme {0} n'existe pas., +Program {0} does not exist.,Le programme {0} n'existe pas., Program: ,Programme:, Progress % for a task cannot be more than 100.,% de Progression pour une tâche ne peut pas être supérieur à 100., Project Collaboration Invitation,Invitation de Collaboration à un Projet, @@ -2301,7 +2301,7 @@ Purchase Order,Bon de commande, Purchase Order Amount,Bon de commande, Purchase Order Amount(Company Currency),Montant du bon de commande (devise de la société), Purchase Order Date,Date du bon de commande, -Purchase Order Items not received on time,Articles de commande d'achat non reçus à temps, +Purchase Order Items not received on time,Articles de commande d'achat non reçus à temps, Purchase Order number required for Item {0},Numéro de Bon de Commande requis pour l'Article {0}, Purchase Order to Payment,Du Bon de Commande au Paiement, Purchase Order {0} is not submitted,Le Bon de Commande {0} n’est pas soumis, @@ -2324,7 +2324,7 @@ Quality,Qualité, Quality Action,Action Qualité, Quality Goal.,Objectif de qualité., Quality Inspection,Inspection de la Qualité, -Quality Inspection: {0} is not submitted for the item: {1} in row {2},Contrôle qualité: {0} n'est pas soumis pour l'élément: {1} à la ligne {2}., +Quality Inspection: {0} is not submitted for the item: {1} in row {2},Contrôle qualité: {0} n'est pas soumis pour l'élément: {1} à la ligne {2}., Quality Management,Gestion de la qualité, Quality Meeting,Réunion de qualité, Quality Procedure,Procédure de qualité, @@ -2371,12 +2371,12 @@ Reading Uploaded File,Lecture du fichier téléchargé, Real Estate,Immobilier, Reason For Putting On Hold,Raison de la mise en attente, Reason for Hold,Raison de tenir, -Reason for hold: ,Raison de l'attente:, +Reason for hold: ,Raison de l'attente:, Receipt,Reçu, Receipt document must be submitted,Le reçu doit être soumis, Receivable,Créance, Receivable Account,Compte Débiteur, -Receive at Warehouse Entry,Recevoir à l'entrée de l'entrepôt, +Receive at Warehouse Entry,Recevoir à l'entrée de l'entrepôt, Received,Reçu, Received On,Reçu le, Received Quantity,Quantité reçue, @@ -2402,7 +2402,7 @@ Reference No.,Numéro de référence, Reference Number,Numéro de réference, Reference Owner,Responsable de la Référence, Reference Type,Type de référence, -"Reference: {0}, Item Code: {1} and Customer: {2}","Référence: {0}, Code de l'article: {1} et Client: {2}", +"Reference: {0}, Item Code: {1} and Customer: {2}","Référence: {0}, Code de l'article: {1} et Client: {2}", References,Références, Refresh Token,Jeton de Rafraîchissement, Region,Région, @@ -2413,7 +2413,7 @@ Related,en relation, Relation with Guardian1,Relation avec Tuteur1, Relation with Guardian2,Relation avec Tuteur2, Release Date,Date de la fin de mise en attente, -Reload Linked Analysis,Recharger l'analyse liée, +Reload Linked Analysis,Recharger l'analyse liée, Remaining,Restant, Remaining Balance,Solde restant, Remarks,Remarques, @@ -2460,16 +2460,16 @@ Reserved Qty,Qté Réservées, Reserved Qty for Production,Qté Réservée pour la Production, Reserved Qty for Production: Raw materials quantity to make manufacturing items.,Qté réservée à la production: quantité de matières premières permettant de fabriquer des articles de fabrication., "Reserved Qty: Quantity ordered for sale, but not delivered.","Réservés Quantité: Quantité de commande pour la vente , mais pas livré .", -Reserved Warehouse is mandatory for Item {0} in Raw Materials supplied,L'entrepôt réservé est obligatoire pour l'article {0} dans les matières premières fournies, +Reserved Warehouse is mandatory for Item {0} in Raw Materials supplied,L'entrepôt réservé est obligatoire pour l'article {0} dans les matières premières fournies, Reserved for manufacturing,Réservé pour la production, Reserved for sale,Réservé à la vente, Reserved for sub contracting,Réservé à la sous-traitance, Resistant,Résistant, -Resolve error and upload again.,Résoudre l'erreur et télécharger à nouveau., +Resolve error and upload again.,Résoudre l'erreur et télécharger à nouveau., Response,Réponse, Responsibilities,Responsabilités, Rest Of The World,Reste du monde, -Restart Subscription,Redémarrer l'abonnement, +Restart Subscription,Redémarrer l'abonnement, Restaurant,Restaurant, Result Date,Date de résultat, Result already Submitted,Résultat déjà soumis, @@ -2479,13 +2479,13 @@ Retail & Wholesale,Vente de Détail & en Gros, Retail Operations,Opérations de détail, Retained Earnings,Bénéfices Non Répartis, Retention Stock Entry,Entrée de stock de rétention, -Retention Stock Entry already created or Sample Quantity not provided,Saisie de stock de rétention déjà créée ou quantité d'échantillon non fournie, +Retention Stock Entry already created or Sample Quantity not provided,Saisie de stock de rétention déjà créée ou quantité d'échantillon non fournie, Return,Retour, Return / Credit Note,Retour / Note de crédit, Return / Debit Note,Retour / Note de Débit, Returns,Retours, Reverse Journal Entry,Ecriture de journal de contre-passation, -Review Invitation Sent,Examiner l'invitation envoyée, +Review Invitation Sent,Examiner l'invitation envoyée, Review and Action,Révision et action, Role,Rôle, Rooms Booked,Chambres réservées, @@ -2506,10 +2506,10 @@ Row # {0}: Serial No is mandatory,Ligne # {0} : N° de série est obligatoire, Row # {0}: Serial No {1} does not match with {2} {3},Ligne # {0} : N° de série {1} ne correspond pas à {2} {3}, Row #{0} (Payment Table): Amount must be negative,Row # {0} (Table de paiement): le montant doit être négatif, Row #{0} (Payment Table): Amount must be positive,Ligne #{0} (Table de paiement): Le montant doit être positif, -Row #{0}: Account {1} does not belong to company {2},Ligne # {0}: le compte {1} n'appartient pas à la société {2}, +Row #{0}: Account {1} does not belong to company {2},Ligne # {0}: le compte {1} n'appartient pas à la société {2}, Row #{0}: Allocated Amount cannot be greater than outstanding amount.,Ligne # {0}: montant attribué ne peut pas être supérieur au montant en souffrance., "Row #{0}: Asset {1} cannot be submitted, it is already {2}","Ligne #{0} : L’Actif {1} ne peut pas être soumis, il est déjà {2}", -Row #{0}: Cannot set Rate if amount is greater than billed amount for Item {1}.,Ligne n ° {0}: impossible de définir le tarif si le montant est supérieur au montant facturé pour l'élément {1}., +Row #{0}: Cannot set Rate if amount is greater than billed amount for Item {1}.,Ligne n ° {0}: impossible de définir le tarif si le montant est supérieur au montant facturé pour l'élément {1}., Row #{0}: Clearance date {1} cannot be before Cheque Date {2},Ligne #{0} : Date de compensation {1} ne peut pas être antérieure à la Date du Chèque {2}, Row #{0}: Duplicate entry in References {1} {2},Ligne # {0}: entrée en double dans les références {1} {2}, Row #{0}: Expected Delivery Date cannot be before Purchase Order Date,Ligne {0}: la date de livraison prévue ne peut pas être avant la date de commande, @@ -2527,15 +2527,15 @@ Row #{0}: Rejected Qty can not be entered in Purchase Return,Ligne #{0} : Qté R Row #{0}: Rejected Warehouse is mandatory against rejected Item {1},Ligne #{0} : Entrepôt de Rejet est obligatoire pour l’Article rejeté {1}, Row #{0}: Reqd by Date cannot be before Transaction Date,La ligne # {0}: Reqd par date ne peut pas être antérieure à la date de la transaction, Row #{0}: Set Supplier for item {1},Ligne #{0} : Définir Fournisseur pour l’article {1}, -Row #{0}: Status must be {1} for Invoice Discounting {2},Ligne n ° {0}: l'état doit être {1} pour l'actualisation de facture {2}., +Row #{0}: Status must be {1} for Invoice Discounting {2},Ligne n ° {0}: l'état doit être {1} pour l'actualisation de facture {2}., "Row #{0}: The batch {1} has only {2} qty. Please select another batch which has {3} qty available or split the row into multiple rows, to deliver/issue from multiple batches","Ligne # {0}: Le lot {1} n'a que {2} qté(s). Veuillez sélectionner un autre lot contenant {3} qtés disponible ou diviser la rangée en plusieurs lignes, pour livrer / émettre à partir de plusieurs lots", Row #{0}: Timings conflicts with row {1},Ligne #{0}: Minutage en conflit avec la ligne {1}, Row #{0}: {1} can not be negative for item {2},Ligne #{0} : {1} ne peut pas être négatif pour l’article {2}, Row No {0}: Amount cannot be greater than Pending Amount against Expense Claim {1}. Pending Amount is {2},Ligne N° {0}: Le montant ne peut être supérieur au Montant en Attente pour la Note de Frais {1}. Le Montant en Attente est de {2}, -Row {0} : Operation is required against the raw material item {1},Ligne {0}: l'opération est requise pour l'article de matière première {1}, +Row {0} : Operation is required against the raw material item {1},Ligne {0}: l'opération est requise pour l'article de matière première {1}, Row {0}# Allocated amount {1} cannot be greater than unclaimed amount {2},La ligne {0} # Montant alloué {1} ne peut pas être supérieure au montant non réclamé {2}, -Row {0}# Item {1} cannot be transferred more than {2} against Purchase Order {3},La ligne {0} # article {1} ne peut pas être transférée plus de {2} par commande d'achat {3}, -Row {0}# Paid Amount cannot be greater than requested advance amount,La ligne {0} # Montant payé ne peut pas être supérieure au montant de l'avance demandée, +Row {0}# Item {1} cannot be transferred more than {2} against Purchase Order {3},La ligne {0} # article {1} ne peut pas être transférée plus de {2} par commande d'achat {3}, +Row {0}# Paid Amount cannot be greater than requested advance amount,La ligne {0} # Montant payé ne peut pas être supérieure au montant de l'avance demandée, Row {0}: Activity Type is mandatory.,Ligne {0} : Le Type d'Activité est obligatoire., Row {0}: Advance against Customer must be credit,Ligne {0} : L’Avance du Client doit être un crédit, Row {0}: Advance against Supplier must be debit,Ligne {0} : L’Avance du Fournisseur doit être un débit, @@ -2548,7 +2548,7 @@ Row {0}: Cost center is required for an item {1},Ligne {0}: le Centre de Coûts Row {0}: Credit entry can not be linked with a {1},Ligne {0} : L’Écriture de crédit ne peut pas être liée à un {1}, Row {0}: Currency of the BOM #{1} should be equal to the selected currency {2},Ligne {0} : La devise de la LDM #{1} doit être égale à la devise sélectionnée {2}, Row {0}: Debit entry can not be linked with a {1},Ligne {0} : L’Écriture de Débit ne peut pas être lié à un {1}, -Row {0}: Depreciation Start Date is required,Ligne {0}: la date de début de l'amortissement est obligatoire, +Row {0}: Depreciation Start Date is required,Ligne {0}: la date de début de l'amortissement est obligatoire, Row {0}: Enter location for the asset item {1},Ligne {0}: entrez la localisation de l'actif {1}, Row {0}: Exchange Rate is mandatory,Ligne {0} : Le Taux de Change est obligatoire, Row {0}: Expected Value After Useful Life must be less than Gross Purchase Amount,Ligne {0}: la valeur attendue après la durée de vie utile doit être inférieure au montant brut de l'achat, @@ -2562,19 +2562,19 @@ Row {0}: Party / Account does not match with {1} / {2} in {3} {4},Ligne {0} : Ti Row {0}: Party Type and Party is required for Receivable / Payable account {1},Ligne {0} : Le Type de Tiers et le Tiers sont requis pour le compte Débiteur / Créditeur {1}, Row {0}: Payment against Sales/Purchase Order should always be marked as advance,Ligne {0} : Paiements contre Commandes Client / Fournisseur doivent toujours être marqués comme des avances, Row {0}: Please check 'Is Advance' against Account {1} if this is an advance entry.,Ligne {0} : Veuillez vérifier 'Est Avance' sur le compte {1} si c'est une avance., -Row {0}: Please set at Tax Exemption Reason in Sales Taxes and Charges,Ligne {0}: Définissez le motif d'exemption de taxe dans les taxes de vente et les frais., +Row {0}: Please set at Tax Exemption Reason in Sales Taxes and Charges,Ligne {0}: Définissez le motif d'exemption de taxe dans les taxes de vente et les frais., Row {0}: Please set the Mode of Payment in Payment Schedule,Ligne {0}: Veuillez définir le mode de paiement dans le calendrier de paiement., Row {0}: Please set the correct code on Mode of Payment {1},Ligne {0}: définissez le code correct sur le mode de paiement {1}., Row {0}: Qty is mandatory,Ligne {0} : Qté obligatoire, -Row {0}: Quality Inspection rejected for item {1},Ligne {0}: le contrôle qualité a été rejeté pour l'élément {1}., +Row {0}: Quality Inspection rejected for item {1},Ligne {0}: le contrôle qualité a été rejeté pour l'élément {1}., Row {0}: UOM Conversion Factor is mandatory,Ligne {0} : Facteur de Conversion LDM est obligatoire, -Row {0}: select the workstation against the operation {1},Ligne {0}: sélectionnez le poste de travail en fonction de l'opération {1}, +Row {0}: select the workstation against the operation {1},Ligne {0}: sélectionnez le poste de travail en fonction de l'opération {1}, Row {0}: {1} Serial numbers required for Item {2}. You have provided {3}.,Ligne {0}: {1} Numéros de série requis pour l'article {2}. Vous en avez fourni {3}., -Row {0}: {1} is required to create the Opening {2} Invoices,La ligne {0}: {1} est requise pour créer les factures d'ouverture {2}, +Row {0}: {1} is required to create the Opening {2} Invoices,La ligne {0}: {1} est requise pour créer les factures d'ouverture {2}, Row {0}: {1} must be greater than 0,Ligne {0}: {1} doit être supérieure à 0, Row {0}: {1} {2} does not match with {3},Ligne {0} : {1} {2} ne correspond pas à {3}, Row {0}:Start Date must be before End Date,Ligne {0} : La Date de Début doit être avant la Date de Fin, -Rows with duplicate due dates in other rows were found: {0},Des lignes avec des dates d'échéance en double dans les autres lignes ont été trouvées: {0}, +Rows with duplicate due dates in other rows were found: {0},Des lignes avec des dates d'échéance en double dans les autres lignes ont été trouvées: {0}, Rules for adding shipping costs.,Règles pour l'ajout de frais de port., Rules for applying pricing and discount.,Règles pour l’application des tarifs et des remises., S.O. No.,S.O. N°., @@ -2586,10 +2586,10 @@ Salary Slip ID,ID Fiche de Paie, Salary Slip of employee {0} already created for this period,Fiche de Paie de l'employé {0} déjà créée pour cette période, Salary Slip of employee {0} already created for time sheet {1},Fiche de Paie de l'employé {0} déjà créée pour la feuille de temps {1}, Salary Slip submitted for period from {0} to {1},Fiche de paie soumise pour la période du {0} au {1}, -Salary Structure Assignment for Employee already exists,La structure de la structure salariale pour l'employé existe déjà, +Salary Structure Assignment for Employee already exists,La structure de la structure salariale pour l'employé existe déjà, Salary Structure Missing,Grille des Salaires Manquante, -Salary Structure must be submitted before submission of Tax Ememption Declaration,La structure salariale doit être soumise avant la soumission de la déclaration d'émigration fiscale, -Salary Structure not found for employee {0} and date {1},Structure de salaire non trouvée pour l'employé {0} et la date {1}, +Salary Structure must be submitted before submission of Tax Ememption Declaration,La structure salariale doit être soumise avant la soumission de la déclaration d'émigration fiscale, +Salary Structure not found for employee {0} and date {1},Structure de salaire non trouvée pour l'employé {0} et la date {1}, Salary Structure should have flexible benefit component(s) to dispense benefit amount,La structure salariale devrait comporter une ou plusieurs composantes de prestation sociales variables pour la distribution du montant de la prestation, "Salary already processed for period between {0} and {1}, Leave application period cannot be between this date range.","Salaire déjà traité pour la période entre {0} et {1}, La période de demande de congé ne peut pas être entre cette plage de dates.", Sales,Ventes, @@ -2626,7 +2626,7 @@ Same item cannot be entered multiple times.,Le même article ne peut pas être e Same supplier has been entered multiple times,Le même fournisseur a été saisi plusieurs fois, Sample,Échantillon, Sample Collection,Collecte d'Échantillons, -Sample quantity {0} cannot be more than received quantity {1},La quantité d'échantillon {0} ne peut pas dépasser la quantité reçue {1}, +Sample quantity {0} cannot be more than received quantity {1},La quantité d'échantillon {0} ne peut pas dépasser la quantité reçue {1}, Sanctioned,Sanctionné, Sanctioned Amount,Montant Approuvé, Sanctioned Amount cannot be greater than Claim Amount in Row {0}.,Le Montant Approuvé ne peut pas être supérieur au Montant Réclamé à la ligne {0}., @@ -2636,12 +2636,12 @@ Saved,Enregistré, Saving {0},Enregistrement {0}, Scan Barcode,Scan Code Barre, Schedule,Calendrier, -Schedule Admission,Calendrier d'admission, +Schedule Admission,Calendrier d'admission, Schedule Course,Cours Calendrier, Schedule Date,Date du Calendrier, Schedule Discharge,Décharge horaire, Scheduled,Prévu, -Scheduled Upto,Programmé jusqu'à, +Scheduled Upto,Programmé jusqu'à, "Schedules for {0} overlaps, do you want to proceed after skiping overlaped slots ?","Les plannings pour {0} se chevauchent, voulez-vous continuer sans prendre en compte les créneaux qui se chevauchent ?", Score cannot be greater than Maximum Score,Score ne peut pas être supérieure à Score maximum, Score must be less than or equal to 5,Score doit être inférieur ou égal à 5, @@ -2666,7 +2666,7 @@ See past orders,Voir les commandes passées, See past quotations,Voir les citations passées, Select,Sélectionner, Select Alternate Item,Sélectionnez un autre élément, -Select Attribute Values,Sélectionner les valeurs d'attribut, +Select Attribute Values,Sélectionner les valeurs d'attribut, Select BOM,Sélectionner LDM, Select BOM and Qty for Production,Sélectionner la LDM et la Qté pour la Production, "Select BOM, Qty and For Warehouse","Sélectionner une nomenclature, une quantité et un entrepôt", @@ -2703,7 +2703,7 @@ Select or add new customer,Sélectionner ou ajoutez nouveau client, Select students manually for the Activity based Group,Sélectionner les élèves manuellement pour un Groupe basé sur l'Activité, Select the customer or supplier.,Veuillez sélectionner le client ou le fournisseur., Select the nature of your business.,Sélectionner la nature de votre entreprise., -Select the program first,Sélectionnez d'abord le programme, +Select the program first,Sélectionnez d'abord le programme, Select to add Serial Number.,Sélectionnez pour ajouter un numéro de série., Select your Domains,Sélectionnez vos domaines, Selected Price List should have buying and selling fields checked.,La liste de prix sélectionnée doit avoir les champs d'achat et de vente cochés., @@ -2724,7 +2724,7 @@ Sent,Envoyé, Serial #,Série #, Serial No and Batch,N° de Série et lot, Serial No is mandatory for Item {0},N° de Série est obligatoire pour l'Article {0}, -Serial No {0} does not belong to Batch {1},Le numéro de série {0} n'appartient pas au lot {1}, +Serial No {0} does not belong to Batch {1},Le numéro de série {0} n'appartient pas au lot {1}, Serial No {0} does not belong to Delivery Note {1},N° de Série {0} ne fait pas partie du Bon de Livraison {1}, Serial No {0} does not belong to Item {1},N° de Série {0} n'appartient pas à l'Article {1}, Serial No {0} does not belong to Warehouse {1},N° de Série {0} ne fait pas partie de l’Entrepôt {1}, @@ -2753,11 +2753,11 @@ Service Expense,Frais de service, Service Level Agreement,Contrat de niveau de service, Service Level Agreement.,Contrat de niveau de service., Service Level.,Niveau de service., -Service Stop Date cannot be after Service End Date,La date d'arrêt du service ne peut pas être postérieure à la date de fin du service, -Service Stop Date cannot be before Service Start Date,La date d'arrêt du service ne peut pas être antérieure à la date de début du service, +Service Stop Date cannot be after Service End Date,La date d'arrêt du service ne peut pas être postérieure à la date de fin du service, +Service Stop Date cannot be before Service Start Date,La date d'arrêt du service ne peut pas être antérieure à la date de début du service, Services,Services, "Set Default Values like Company, Currency, Current Fiscal Year, etc.","Définir les Valeurs par Défaut comme : Societé, Devise, Exercice Actuel, etc...", -Set Details,Détails de l'ensemble, +Set Details,Détails de l'ensemble, Set New Release Date,Définir la nouvelle date de fin de mise en attente, Set Project and all Tasks to status {0}?,Définir le projet et toutes les tâches sur le statut {0}?, Set Status,Définir le statut, @@ -2769,15 +2769,15 @@ Set as Lost,Définir comme perdu, Set as Open,Définir comme ouvert, Set default inventory account for perpetual inventory,Configurer le compte d'inventaire par défaut pour l'inventaire perpétuel, Set default mode of payment,Définir le mode de paiement par défaut, -Set this if the customer is a Public Administration company.,Définissez cette option si le client est une société d'administration publique., -Set {0} in asset category {1} or company {2},Définissez {0} dans la catégorie d'actifs {1} ou la société {2}, +Set this if the customer is a Public Administration company.,Définissez cette option si le client est une société d'administration publique., +Set {0} in asset category {1} or company {2},Définissez {0} dans la catégorie d'actifs {1} ou la société {2}, "Setting Events to {0}, since the Employee attached to the below Sales Persons does not have a User ID{1}","Définir les Événements à {0}, puisque l'employé attaché au Commercial ci-dessous n'a pas d'ID Utilisateur {1}", Setting defaults,Définition des valeurs par défaut, Setting up Email,Configurer l'Email, Setting up Email Account,Configuration du Compte Email, Setting up Employees,Configuration des Employés, Setting up Taxes,Configuration des Impôts, -Setting up company,Création d'entreprise, +Setting up company,Création d'entreprise, Settings,Paramètres, "Settings for online shopping cart such as shipping rules, price list etc.","Paramètres du panier tels que les règles de livraison, liste de prix, etc.", Settings for website homepage,Paramètres de la page d'accueil du site, @@ -2799,9 +2799,9 @@ Ship To State,Ship To State, Shipments,Livraisons, Shipping,livraison, Shipping Address,Adresse de livraison, -"Shipping Address does not have country, which is required for this Shipping Rule","L'adresse de livraison n'a pas de pays, ce qui est requis pour cette règle d'expédition", -Shipping rule only applicable for Buying,Règle d'expédition applicable uniquement pour l'achat, -Shipping rule only applicable for Selling,Règle d'expédition applicable uniquement pour la vente, +"Shipping Address does not have country, which is required for this Shipping Rule","L'adresse de livraison n'a pas de pays, ce qui est requis pour cette règle d'expédition", +Shipping rule only applicable for Buying,Règle d'expédition applicable uniquement pour l'achat, +Shipping rule only applicable for Selling,Règle d'expédition applicable uniquement pour la vente, Shopify Supplier,Fournisseur Shopify, Shopping Cart,Panier, Shopping Cart Settings,Paramètres du panier, @@ -2809,9 +2809,9 @@ Short Name,Nom court, Shortage Qty,Qté de Pénurie, Show Completed,Montrer terminé, Show Cumulative Amount,Afficher le montant cumulatif, -Show Employee,Afficher l'employé, +Show Employee,Afficher l'employé, Show Open,Afficher ouverte, -Show Opening Entries,Afficher les entrées d'ouverture, +Show Opening Entries,Afficher les entrées d'ouverture, Show Payment Details,Afficher les détails du paiement, Show Return Entries,Afficher les entrées de retour, Show Salary Slip,Afficher la Fiche de Salaire, @@ -2827,7 +2827,7 @@ Silt,Limon, Single Variant,Variante unique, Single unit of an Item.,Seule unité d'un Article., "Skipping Leave Allocation for the following employees, as Leave Allocation records already exists against them. {0}","Attribution des congés de congé pour les employés suivants, car des dossiers de répartition des congés existent déjà contre eux. {0}", -"Skipping Salary Structure Assignment for the following employees, as Salary Structure Assignment records already exists against them. {0}","Ignorer l'affectation de structure salariale pour les employés suivants, car des enregistrements d'affectation de structure salariale existent déjà pour eux. {0}", +"Skipping Salary Structure Assignment for the following employees, as Salary Structure Assignment records already exists against them. {0}","Ignorer l'affectation de structure salariale pour les employés suivants, car des enregistrements d'affectation de structure salariale existent déjà pour eux. {0}", Slideshow,Diaporama, Slots for {0} are not added to the schedule,Les créneaux pour {0} ne sont pas ajoutés à l'agenda, Small,Petit, @@ -2860,9 +2860,9 @@ Standard Buying,Achat standard, Standard Selling,Vente standard, Standard contract terms for Sales or Purchase.,Termes contractuels standards pour Ventes ou Achats, Start Date,Date de début, -Start Date of Agreement can't be greater than or equal to End Date.,La date de début de l'accord ne peut être supérieure ou égale à la date de fin., +Start Date of Agreement can't be greater than or equal to End Date.,La date de début de l'accord ne peut être supérieure ou égale à la date de fin., Start Year,Année de début, -"Start and end dates not in a valid Payroll Period, cannot calculate {0}","Les dates de début et de fin ne faisant pas partie d'une période de paie valide, impossible de calculer {0}", +"Start and end dates not in a valid Payroll Period, cannot calculate {0}","Les dates de début et de fin ne faisant pas partie d'une période de paie valide, impossible de calculer {0}", "Start and end dates not in a valid Payroll Period, cannot calculate {0}.","Les dates de début et de fin ne figurant pas dans une période de paie valide, le système ne peut pas calculer {0}.", Start date should be less than end date for Item {0},La date de début doit être antérieure à la date de fin pour l'Article {0}, Start date should be less than end date for task {0},La date de début doit être inférieure à la date de fin de la tâche {0}, @@ -2919,17 +2919,17 @@ Student Group,Groupe Étudiant, Student Group Strength,Force du Groupe d'Étudiant, Student Group is already updated.,Le Groupe d'Étudiants est déjà mis à jour., Student Group or Course Schedule is mandatory,Le Ggroupe d'Étudiants ou le Calendrier des Cours est obligatoire, -Student Group: ,Groupe d'étudiants:, +Student Group: ,Groupe d'étudiants:, Student ID,Carte d'Étudiant, -Student ID: ,Carte d'étudiant:, +Student ID: ,Carte d'étudiant:, Student LMS Activity,Activité LMS des étudiants, Student Mobile No.,N° de Mobile de l'Étudiant, Student Name,Nom de l'Étudiant, -Student Name: ,Nom d'étudiant:, +Student Name: ,Nom d'étudiant:, Student Report Card,Carte d'étudiant, Student is already enrolled.,L'étudiant est déjà inscrit., Student {0} - {1} appears Multiple times in row {2} & {3},Étudiant {0} - {1} apparaît Plusieurs fois dans la ligne {2} & {3}, -Student {0} does not belong to group {1},L'élève {0} n'appartient pas au groupe {1}, +Student {0} does not belong to group {1},L'élève {0} n'appartient pas au groupe {1}, Student {0} exist against student applicant {1},Étudiant {0} existe pour la candidature d'un étudiant {1}, "Students are at the heart of the system, add all your students","Les étudiants sont au cœur du système, ajouter tous vos étudiants", Sub Assemblies,Sous-Ensembles, @@ -2977,10 +2977,10 @@ Supplier Warehouse mandatory for sub-contracted Purchase Receipt,Entrepôt Fourn Supplier database.,Base de données fournisseurs., Supplier {0} not found in {1},Fournisseur {0} introuvable dans {1}, Supplier(s),Fournisseur(s), -Supplies made to UIN holders,Fournitures faites aux titulaires de l'UIN, +Supplies made to UIN holders,Fournitures faites aux titulaires de l'UIN, Supplies made to Unregistered Persons,Fournitures faites à des personnes non inscrites, Suppliies made to Composition Taxable Persons,Suppleies à des personnes assujetties à la composition, -Supply Type,Type d'approvisionnement, +Supply Type,Type d'approvisionnement, Support,Soutien, Support Analytics,Analyse du Support, Support Settings,Paramètres du Support, @@ -3014,9 +3014,9 @@ Tax Rate,Taux d'Imposition, Tax Rule Conflicts with {0},Règle de Taxation est en Conflit avec {0}, Tax Rule for transactions.,Règle de Taxation pour les transactions., Tax Template is mandatory.,Un Modèle de Taxe est obligatoire., -Tax Withholding rates to be applied on transactions.,Taux de retenue d'impôt à appliquer aux transactions., +Tax Withholding rates to be applied on transactions.,Taux de retenue d'impôt à appliquer aux transactions., Tax template for buying transactions.,Modèle de taxe pour les opérations d’achat., -Tax template for item tax rates.,Modèle de taxe pour les taux de taxe d'article., +Tax template for item tax rates.,Modèle de taxe pour les taux de taxe d'article., Tax template for selling transactions.,Modèle de taxe pour les opérations de vente., Taxable Amount,Montant Taxable, Taxes,Taxes, @@ -3044,7 +3044,7 @@ Thank you for your business!,Merci pour votre entreprise !, The 'From Package No.' field must neither be empty nor it's value less than 1.,Le champ 'N° de Paquet' ne doit pas être vide ni sa valeur être inférieure à 1., The Brand,La marque, The Item {0} cannot have Batch,L'Article {0} ne peut être en Lot, -The Loyalty Program isn't valid for the selected company,Le programme de fidélité n'est pas valable pour la société sélectionnée, +The Loyalty Program isn't valid for the selected company,Le programme de fidélité n'est pas valable pour la société sélectionnée, The Payment Term at row {0} is possibly a duplicate.,Le délai de paiement à la ligne {0} est probablement un doublon., The Term End Date cannot be earlier than the Term Start Date. Please correct the dates and try again.,La Date de Fin de Terme ne peut pas être antérieure à la Date de Début de Terme. Veuillez corriger les dates et essayer à nouveau., The Term End Date cannot be later than the Year End Date of the Academic Year to which the term is linked (Academic Year {}). Please correct the dates and try again.,La Date de Fin de Terme ne peut pas être postérieure à la Date de Fin de l'Année Académique à laquelle le terme est lié (Année Académique {}). Veuillez corriger les dates et essayer à nouveau., @@ -3064,21 +3064,21 @@ The payment gateway account in plan {0} is different from the payment gateway ac The request for quotation can be accessed by clicking on the following link,La demande de devis peut être consultée en cliquant sur le lien suivant, The selected BOMs are not for the same item,Les LDMs sélectionnées ne sont pas pour le même article, The selected item cannot have Batch,L’article sélectionné ne peut pas avoir de Lot, -The seller and the buyer cannot be the same,Le vendeur et l'acheteur ne peuvent pas être les mêmes, -The shareholder does not belong to this company,L'actionnaire n'appartient pas à cette société, +The seller and the buyer cannot be the same,Le vendeur et l'acheteur ne peuvent pas être les mêmes, +The shareholder does not belong to this company,L'actionnaire n'appartient pas à cette société, The shares already exist,Les actions existent déjà, The shares don't exist with the {0},Les actions n'existent pas pour {0}, -"The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Draft stage","La tâche a été mise en file d'attente en tant que tâche en arrière-plan. En cas de problème de traitement en arrière-plan, le système ajoute un commentaire concernant l'erreur sur ce rapprochement des stocks et revient au stade de brouillon.", +"The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Draft stage","La tâche a été mise en file d'attente en tant que tâche en arrière-plan. En cas de problème de traitement en arrière-plan, le système ajoute un commentaire concernant l'erreur sur ce rapprochement des stocks et revient au stade de brouillon.", "Then Pricing Rules are filtered out based on Customer, Customer Group, Territory, Supplier, Supplier Type, Campaign, Sales Partner etc.","Les Règles de Tarification sont ensuite filtrées en fonction des Clients, des Groupes de Clients, des Régions, des Fournisseurs, des Groupes de Fournisseurs, des Campagnes, des Partenaires Commerciaux, etc.", "There are inconsistencies between the rate, no of shares and the amount calculated","Il existe des incohérences entre le prix unitaire, le nombre d'actions et le montant calculé", There are more holidays than working days this month.,Il y a plus de vacances que de jours travaillés ce mois-ci., There can be multiple tiered collection factor based on the total spent. But the conversion factor for redemption will always be same for all the tier.,Il peut y avoir plusieurs facteurs de collecte hiérarchisés en fonction du total dépensé. Mais le facteur de conversion pour l'échange sera toujours le même pour tous les niveaux., There can only be 1 Account per Company in {0} {1},Il ne peut y avoir qu’un Compte par Société dans {0} {1}, "There can only be one Shipping Rule Condition with 0 or blank value for ""To Value""","Il ne peut y avoir qu’une Condition de Règle de Livraison avec 0 ou une valeur vide pour « A la Valeur""", -There is no leave period in between {0} and {1},Il n'y a pas de période de congé entre {0} et {1}, +There is no leave period in between {0} and {1},Il n'y a pas de période de congé entre {0} et {1}, There is not enough leave balance for Leave Type {0},Il n'y a pas assez de solde de congés pour les Congés de Type {0}, There is nothing to edit.,Il n'y a rien à modifier., -There isn't any item variant for the selected item,Il n'y a pas de variante d'article pour l'article sélectionné, +There isn't any item variant for the selected item,Il n'y a pas de variante d'article pour l'article sélectionné, "There seems to be an issue with the server's GoCardless configuration. Don't worry, in case of failure, the amount will get refunded to your account.","Il semble y avoir un problème avec la configuration de GoCardless sur le serveur. Ne vous inquiétez pas, en cas d'échec, le montant sera remboursé sur votre compte.", There were errors creating Course Schedule,Des erreurs se sont produites lors de la création du programme, There were errors.,Il y a eu des erreurs., @@ -3108,7 +3108,7 @@ This is based on transactions against this Healthcare Practitioner.,Ce graphique This is based on transactions against this Patient. See timeline below for details,Ceci est basé sur les transactions de ce patient. Voir la chronologie ci-dessous pour plus de détails, This is based on transactions against this Sales Person. See timeline below for details,Ceci est basé sur les transactions contre ce vendeur. Voir la chronologie ci-dessous pour plus de détails, This is based on transactions against this Supplier. See timeline below for details,Basé sur les transactions avec ce fournisseur. Voir la chronologie ci-dessous pour plus de détails, -This will submit Salary Slips and create accrual Journal Entry. Do you want to proceed?,Cela permettra de soumettre des bulletins de salaire et de créer une écriture de journal d'accumulation. Voulez-vous poursuivre?, +This will submit Salary Slips and create accrual Journal Entry. Do you want to proceed?,Cela permettra de soumettre des bulletins de salaire et de créer une écriture de journal d'accumulation. Voulez-vous poursuivre?, This {0} conflicts with {1} for {2} {3},Ce {0} est en conflit avec {1} pour {2} {3}, Time Sheet for manufacturing.,Feuille de Temps pour la production., Time Tracking,Suivi du temps, @@ -3135,7 +3135,7 @@ To Date should be within the Fiscal Year. Assuming To Date = {0},La Date Finale To Datetime,À la Date, To Deliver,À Livrer, To Deliver and Bill,À Livrer et Facturer, -To Fiscal Year,À l'année fiscale, +To Fiscal Year,À l'année fiscale, To GSTIN,GSTIN (Destination), To Party Name,Nom du tiers (Destination), To Pin Code,Code postal (Destination), @@ -3151,7 +3151,7 @@ To date can not greater than employee's relieving date,La date de fin ne peut pa "To filter based on Party, select Party Type first","Pour filtrer en fonction du Tiers, sélectionnez d’abord le Type de Tiers", "To get the best out of ERPNext, we recommend that you take some time and watch these help videos.","Pour tirer le meilleur parti d’ERPNext, nous vous recommandons de prendre un peu de temps et de regarder ces vidéos d'aide.", "To include tax in row {0} in Item rate, taxes in rows {1} must also be included","Pour inclure la taxe de la ligne {0} dans le prix de l'Article, les taxes des lignes {1} doivent également être incluses", -To make Customer based incentive schemes.,Faire des programmes d'incitation basés sur le client., +To make Customer based incentive schemes.,Faire des programmes d'incitation basés sur le client., "To merge, following properties must be same for both items","Pour fusionner, les propriétés suivantes doivent être les mêmes pour les deux articles", "To not apply Pricing Rule in a particular transaction, all applicable Pricing Rules should be disabled.","Pour ne pas appliquer la Règle de Tarification dans une transaction particulière, toutes les Règles de Tarification applicables doivent être désactivées.", "To set this Fiscal Year as Default, click on 'Set as Default'","Pour définir cet Exercice Fiscal par défaut, cliquez sur ""Définir par défaut""", @@ -3202,9 +3202,9 @@ Total Unpaid: {0},Total des Impayés : {0}, Total Variance,Variance totale, Total Weightage of all Assessment Criteria must be 100%,Le total des pondérations de tous les Critères d'Évaluation doit être égal à 100%, Total advance ({0}) against Order {1} cannot be greater than the Grand Total ({2}),Avance totale ({0}) pour la Commande {1} ne peut pas être supérieure au Total Général ({2}), -Total advance amount cannot be greater than total claimed amount,Le montant total de l'avance ne peut être supérieur au montant total réclamé, +Total advance amount cannot be greater than total claimed amount,Le montant total de l'avance ne peut être supérieur au montant total réclamé, Total advance amount cannot be greater than total sanctioned amount,Le montant total de l'avance ne peut être supérieur au montant total approuvé, -Total allocated leaves are more days than maximum allocation of {0} leave type for employee {1} in the period,Le nombre total de congés alloués est supérieur de plusieurs jours à l'allocation maximale du type de congé {0} pour l'employé {1} au cours de la période, +Total allocated leaves are more days than maximum allocation of {0} leave type for employee {1} in the period,Le nombre total de congés alloués est supérieur de plusieurs jours à l'allocation maximale du type de congé {0} pour l'employé {1} au cours de la période, Total allocated leaves are more than days in the period,Le Total des feuilles attribuées est supérieur au nombre de jours dans la période, Total allocated percentage for sales team should be 100,Pourcentage total attribué à l'équipe commerciale devrait être de 100, Total cannot be zero,Total ne peut pas être zéro, @@ -3303,18 +3303,18 @@ User Forum,Forum de l'Utilisateur, User ID,ID de l'Utilisateur, User ID not set for Employee {0},ID de l'Utilisateur non défini pour l'Employé {0}, User Remark,Remarque de l'Utilisateur, -User has not applied rule on the invoice {0},L'utilisateur n'a pas appliqué la règle sur la facture {0}, -User {0} already exists,L'utilisateur {0} existe déjà, +User has not applied rule on the invoice {0},L'utilisateur n'a pas appliqué la règle sur la facture {0}, +User {0} already exists,L'utilisateur {0} existe déjà, User {0} created,Utilisateur {0} créé, User {0} does not exist,Utilisateur {0} n'existe pas, -User {0} doesn't have any default POS Profile. Check Default at Row {1} for this User.,L'utilisateur {0} n'a aucun profil POS par défaut. Vérifiez par défaut à la ligne {1} pour cet utilisateur., +User {0} doesn't have any default POS Profile. Check Default at Row {1} for this User.,L'utilisateur {0} n'a aucun profil POS par défaut. Vérifiez par défaut à la ligne {1} pour cet utilisateur., User {0} is already assigned to Employee {1},Utilisateur {0} est déjà attribué à l'Employé {1}, -User {0} is already assigned to Healthcare Practitioner {1},L'utilisateur {0} est déjà attribué à un professionnel de la santé {1}, +User {0} is already assigned to Healthcare Practitioner {1},L'utilisateur {0} est déjà attribué à un professionnel de la santé {1}, Users,Utilisateurs, Utility Expenses,Frais de Services d'Utilité Publique, Valid From Date must be lesser than Valid Upto Date.,La date de début de validité doit être inférieure à la date de mise en service valide., Valid Till,Valable Jusqu'au, -Valid from and valid upto fields are mandatory for the cumulative,Les champs valides à partir de et valables jusqu'à sont obligatoires pour le cumulatif., +Valid from and valid upto fields are mandatory for the cumulative,Les champs valides à partir de et valables jusqu'à sont obligatoires pour le cumulatif., Valid from date must be less than valid upto date,La date de début de validité doit être inférieure à la date de validité, Valid till date cannot be before transaction date,La date de validité ne peut pas être avant la date de transaction, Validity,Validité, @@ -3327,7 +3327,7 @@ Value Proposition,Proposition de valeur, Value for Attribute {0} must be within the range of {1} to {2} in the increments of {3} for Item {4},Valeur pour l'attribut {0} doit être dans la gamme de {1} à {2} dans les incréments de {3} pour le poste {4}, Value missing,Valeur manquante, Value must be between {0} and {1},La valeur doit être comprise entre {0} et {1}., -"Values of exempt, nil rated and non-GST inward supplies","Valeurs des fournitures importées exonérées, assorties d'une cote zéro et non liées à la TPS", +"Values of exempt, nil rated and non-GST inward supplies","Valeurs des fournitures importées exonérées, assorties d'une cote zéro et non liées à la TPS", Variable,Variable, Variance,Variance, Variance ({}),Variance ({}), @@ -3335,7 +3335,7 @@ Variant,Variante, Variant Attributes,Attributs Variant, Variant Based On cannot be changed,Les variantes basées sur ne peuvent pas être modifiées, Variant Details Report,Rapport détaillé des variantes, -Variant creation has been queued.,La création de variantes a été placée en file d'attente., +Variant creation has been queued.,La création de variantes a été placée en file d'attente., Vehicle Expenses,Frais de véhicule, Vehicle No,N° du Véhicule, Vehicle Type,Type de véhicule, @@ -3354,7 +3354,7 @@ Visit report for maintenance call.,Rapport de visite pour appel de maintenance, Visit the forums,Visitez les forums, Vital Signs,Signes vitaux, Volunteer,Bénévole, -Volunteer Type information.,Volontaire Type d'information., +Volunteer Type information.,Volontaire Type d'information., Volunteer information.,Informations sur le bénévolat, Voucher #,Référence #, Voucher No,N° de Référence, @@ -3367,7 +3367,7 @@ Warehouse is mandatory,L'entrepôt est obligatoire, Warehouse is mandatory for stock Item {0} in row {1},L’entrepôt est obligatoire pour l'Article du stock {0} dans la ligne {1}, Warehouse not found in the system,L'entrepôt n'a pas été trouvé dans le système, "Warehouse required at Row No {0}, please set default warehouse for the item {1} for the company {2}",Entrepôt requis à la ligne n ° {0}. Veuillez définir un entrepôt par défaut pour l'article {1} et la société {2}, -Warehouse required for stock Item {0},Magasin requis pour l'article en stock {0}, +Warehouse required for stock Item {0},Magasin requis pour l'article en stock {0}, Warehouse {0} can not be deleted as quantity exists for Item {1},L'entrepôt {0} ne peut pas être supprimé car il existe une quantité pour l'Article {1}, Warehouse {0} does not belong to company {1},L'entrepôt {0} n'appartient pas à la société {1}, Warehouse {0} does not exist,L'entrepôt {0} n'existe pas, @@ -3442,13 +3442,13 @@ You cannot credit and debit same account at the same time,Vous ne pouvez pas cr You cannot delete Fiscal Year {0}. Fiscal Year {0} is set as default in Global Settings,Vous ne pouvez pas supprimer l'exercice fiscal {0}. L'exercice fiscal {0} est défini par défaut dans les Paramètres Globaux, You cannot delete Project Type 'External',Vous ne pouvez pas supprimer le Type de Projet 'Externe', You cannot edit root node.,Vous ne pouvez pas modifier le nœud racine., -You cannot restart a Subscription that is not cancelled.,Vous ne pouvez pas redémarrer un abonnement qui n'est pas annulé., +You cannot restart a Subscription that is not cancelled.,Vous ne pouvez pas redémarrer un abonnement qui n'est pas annulé., You don't have enought Loyalty Points to redeem,Vous n'avez pas assez de points de fidélité à échanger, -You have already assessed for the assessment criteria {}.,Vous avez déjà évalué les critères d'évaluation {}., +You have already assessed for the assessment criteria {}.,Vous avez déjà évalué les critères d'évaluation {}., You have already selected items from {0} {1},Vous avez déjà choisi des articles de {0} {1}, You have been invited to collaborate on the project: {0},Vous avez été invité à collaborer sur le projet : {0}, You have entered duplicate items. Please rectify and try again.,Vous avez entré un doublon. Veuillez rectifier et essayer à nouveau., -You need to be a user other than Administrator with System Manager and Item Manager roles to register on Marketplace.,Vous devez être un utilisateur autre que l'administrateur avec les rôles System Manager et Item Manager pour vous inscrire sur Marketplace., +You need to be a user other than Administrator with System Manager and Item Manager roles to register on Marketplace.,Vous devez être un utilisateur autre que l'administrateur avec les rôles System Manager et Item Manager pour vous inscrire sur Marketplace., You need to be a user with System Manager and Item Manager roles to add users to Marketplace.,Vous devez être un utilisateur doté de rôles System Manager et Item Manager pour ajouter des utilisateurs à Marketplace., You need to be a user with System Manager and Item Manager roles to register on Marketplace.,Vous devez être un utilisateur avec des rôles System Manager et Item Manager pour vous inscrire sur Marketplace., You need to be logged in to access this page,Vous devez être connecté pour pouvoir accéder à cette page, @@ -3512,11 +3512,11 @@ on,sur, {0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}.,{0} est obligatoire. Peut-être qu’un enregistrement de Taux de Change n'est pas créé pour {1} et {2}., {0} is not a stock Item,{0} n'est pas un Article de stock, {0} is not a valid Batch Number for Item {1},{0} n'est pas un Numéro de Lot valide pour l’Article {1}, -{0} is not added in the table,{0} n'est pas ajouté dans la table, -{0} is not in Optional Holiday List,{0} n'est pas dans la liste des jours fériés facultatifs, -{0} is not in a valid Payroll Period,{0} n'est pas dans une période de paie valide, +{0} is not added in the table,{0} n'est pas ajouté dans la table, +{0} is not in Optional Holiday List,{0} n'est pas dans la liste des jours fériés facultatifs, +{0} is not in a valid Payroll Period,{0} n'est pas dans une période de paie valide, {0} is now the default Fiscal Year. Please refresh your browser for the change to take effect.,{0} est désormais l’Exercice par défaut. Veuillez actualiser la page pour que les modifications soient prises en compte., -{0} is on hold till {1},{0} est en attente jusqu'à {1}, +{0} is on hold till {1},{0} est en attente jusqu'à {1}, {0} item found.,{0} élément trouvé., {0} items found.,{0} éléments trouvés., {0} items in progress,{0} articles en cours, @@ -3525,8 +3525,8 @@ on,sur, {0} must be negative in return document,{0} doit être négatif dans le document de retour, {0} must be submitted,{0} doit être soumis, {0} not allowed to transact with {1}. Please change the Company.,{0} n'est pas autorisé à traiter avec {1}. Veuillez changer la société., -{0} not found for item {1},{0} introuvable pour l'élément {1}, -{0} parameter is invalid,Le paramètre {0} n'est pas valide, +{0} not found for item {1},{0} introuvable pour l'élément {1}, +{0} parameter is invalid,Le paramètre {0} n'est pas valide, {0} payment entries can not be filtered by {1},{0} écritures de paiement ne peuvent pas être filtrées par {1}, {0} should be a value between 0 and 100,{0} devrait être une valeur comprise entre 0 et 100, {0} units of [{1}](#Form/Item/{1}) found in [{2}](#Form/Warehouse/{2}),{0} unités de [{1}] (#Formulaire/Article/{1}) trouvées dans [{2}] (#Formulaire/Entrepôt/{2}), @@ -3536,7 +3536,7 @@ on,sur, {0} variants created.,{0} variantes créées., {0} {1} created,{0} {1} créé, {0} {1} does not exist,{0} {1} n'existe pas, -{0} {1} does not exist.,{0} {1} n'existe pas, +{0} {1} does not exist.,{0} {1} n'existe pas, {0} {1} has been modified. Please refresh.,{0} {1} a été modifié. Veuillez actualiser., {0} {1} has not been submitted so the action cannot be completed,"{0} {1} n'a pas été soumis, donc l'action ne peut pas être complétée", "{0} {1} is associated with {2}, but Party Account is {3}","{0} {1} est associé à {2}, mais le compte tiers est {3}", @@ -3548,8 +3548,8 @@ on,sur, {0} {1} is frozen,{0} {1} est gelée, {0} {1} is fully billed,{0} {1} est entièrement facturé, {0} {1} is not active,{0} {1} n'est pas actif, -{0} {1} is not associated with {2} {3},{0} {1} n'est pas associé à {2} {3}, -{0} {1} is not present in the parent company,{0} {1} n'est pas présent dans la société mère, +{0} {1} is not associated with {2} {3},{0} {1} n'est pas associé à {2} {3}, +{0} {1} is not present in the parent company,{0} {1} n'est pas présent dans la société mère, {0} {1} is not submitted,{0} {1} n'a pas été soumis, {0} {1} is {2},{0} {1} est {2}, {0} {1} must be submitted,{0} {1} doit être soumis, @@ -3608,28 +3608,28 @@ or,ou, Ageing Range 4,Gamme de vieillissement 4, Allocated amount cannot be greater than unadjusted amount,Le montant alloué ne peut être supérieur au montant non ajusté, Allocated amount cannot be negative,Le montant alloué ne peut être négatif, -"Difference Account must be a Asset/Liability type account, since this Stock Entry is an Opening Entry","Le compte d'écart doit être un compte de type actif / passif, car cette entrée de stock est une entrée d'ouverture.", +"Difference Account must be a Asset/Liability type account, since this Stock Entry is an Opening Entry","Le compte d'écart doit être un compte de type actif / passif, car cette entrée de stock est une entrée d'ouverture.", Error in some rows,Erreur dans certaines lignes, Import Successful,Importation réussie, -Please save first,S'il vous plaît enregistrer en premier, -Price not found for item {0} in price list {1},Prix non trouvé pour l'article {0} dans la liste de prix {1}, -Warehouse Type,Type d'entrepôt, -'Date' is required,'Date' est requis, +Please save first,S'il vous plaît enregistrer en premier, +Price not found for item {0} in price list {1},Prix non trouvé pour l'article {0} dans la liste de prix {1}, +Warehouse Type,Type d'entrepôt, +'Date' is required,'Date' est requis, Benefit,Avantage, Budgets,Budgets, Bundle Qty,Quantité de paquet, Company GSTIN,GSTIN de la Société, -Company field is required,Le champ de l'entreprise est obligatoire, +Company field is required,Le champ de l'entreprise est obligatoire, Creating Dimensions...,Créer des dimensions ..., Duplicate entry against the item code {0} and manufacturer {1},Dupliquer la saisie par rapport au code article {0} et au fabricant {1}, Import Chart Of Accounts from CSV / Excel files,Importer un graphique des comptes à partir de fichiers CSV / Excel, -Invalid GSTIN! The input you've entered doesn't match the GSTIN format for UIN Holders or Non-Resident OIDAR Service Providers,GSTIN invalide! L'entrée que vous avez entrée ne correspond pas au format GSTIN pour les titulaires d'un UIN ou les fournisseurs de services OIDAR non résidents, +Invalid GSTIN! The input you've entered doesn't match the GSTIN format for UIN Holders or Non-Resident OIDAR Service Providers,GSTIN invalide! L'entrée que vous avez entrée ne correspond pas au format GSTIN pour les titulaires d'un UIN ou les fournisseurs de services OIDAR non résidents, Invoice Grand Total,Total général de la facture, Last carbon check date cannot be a future date,La date du dernier bilan carbone ne peut pas être une date future, Make Stock Entry,Faire une entrée de stock, Quality Feedback,Commentaires sur la qualité, Quality Feedback Template,Modèle de commentaires sur la qualité, -Rules for applying different promotional schemes.,Règles d'application de différents programmes promotionnels., +Rules for applying different promotional schemes.,Règles d'application de différents programmes promotionnels., Shift,Décalage, Show {0},Montrer {0}, "Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caractères spéciaux sauf "-", "#", ".", "/", "{" Et "}" non autorisés dans les séries de nommage", @@ -3649,7 +3649,7 @@ No data to export,Aucune donnée à exporter, Print Heading,Imprimer Titre, Video,Vidéo, % Of Grand Total,% Du grand total, -'employee_field_value' and 'timestamp' are required.,'employee_field_value' et 'timestamp' sont obligatoires., +'employee_field_value' and 'timestamp' are required.,'employee_field_value' et 'timestamp' sont obligatoires., Company is a mandatory filter.,La société est un filtre obligatoire., From Date is a mandatory filter.,De la date est un filtre obligatoire., From Time cannot be later than To Time for {0},From Time ne peut pas être postérieur à To Time pour {0}, @@ -3657,13 +3657,13 @@ Video,Vidéo, A new appointment has been created for you with {0},Un nouveau rendez-vous a été créé pour vous avec {0}, Account Value,Valeur du compte, Account is mandatory to get payment entries,Le compte est obligatoire pour obtenir les entrées de paiement, -Account is not set for the dashboard chart {0},Le compte n'est pas défini pour le graphique du tableau de bord {0}, +Account is not set for the dashboard chart {0},Le compte n'est pas défini pour le graphique du tableau de bord {0}, Account {0} does not belong to company {1},Compte {0} n'appartient pas à la société {1}, -Account {0} does not exists in the dashboard chart {1},Le compte {0} n'existe pas dans le graphique du tableau de bord {1}, +Account {0} does not exists in the dashboard chart {1},Le compte {0} n'existe pas dans le graphique du tableau de bord {1}, Account: {0} is capital Work in progress and can not be updated by Journal Entry,Compte: {0} est un travail capital et ne peut pas être mis à jour par une écriture au journal., -Account: {0} is not permitted under Payment Entry,Compte: {0} n'est pas autorisé sous Saisie du paiement., +Account: {0} is not permitted under Payment Entry,Compte: {0} n'est pas autorisé sous Saisie du paiement., Accounting Dimension {0} is required for 'Balance Sheet' account {1}.,La dimension de comptabilité {0} est requise pour le compte "Bilan" {1}., -Accounting Dimension {0} is required for 'Profit and Loss' account {1}.,La dimension de comptabilité {0} est requise pour le compte 'Bénéfices et pertes' {1}., +Accounting Dimension {0} is required for 'Profit and Loss' account {1}.,La dimension de comptabilité {0} est requise pour le compte 'Bénéfices et pertes' {1}., Accounting Masters,Maîtres Comptables, Accounting Period overlaps with {0},La période comptable chevauche avec {0}, Activity,Activité, @@ -3672,14 +3672,14 @@ Add Child,Ajouter une Sous-Catégorie, Add Loan Security,Ajouter une garantie de prêt, Add Multiple,Ajout Multiple, Add Participants,Ajouter des participants, -Add to Featured Item,Ajouter à l'article en vedette, +Add to Featured Item,Ajouter à l'article en vedette, Add your review,Ajouter votre avis, Add/Edit Coupon Conditions,Ajouter / Modifier les conditions du coupon, Added to Featured Items,Ajouté aux articles en vedette, Added {0} ({1}),Ajouté {0} ({1}), Address Line 1,Adresse Ligne 1, Addresses,Adresses, -Admission End Date should be greater than Admission Start Date.,La date de fin d'admission doit être supérieure à la date de début d'admission., +Admission End Date should be greater than Admission Start Date.,La date de fin d'admission doit être supérieure à la date de début d'admission., Against Loan,Contre le prêt, Against Loan:,Contre le prêt:, All,Tout, @@ -3693,35 +3693,35 @@ Applied Coupon Code,Code de coupon appliqué, Apply Coupon Code,Appliquer le code de coupon, Appointment Booking,Prise de rendez-vous, "As there are existing transactions against item {0}, you can not change the value of {1}","Comme il existe des transactions avec l'article {0}, vous ne pouvez pas changer la valeur de {1}", -Asset Id,ID d'actif, -Asset Value,Valeur d'actif, -Asset Value Adjustment cannot be posted before Asset's purchase date {0}.,L'ajustement de la valeur de l'actif ne peut pas être enregistré avant la date d'achat de l'actif {0} ., -Asset {0} does not belongs to the custodian {1},L'élément {0} n'appartient pas au dépositaire {1}, -Asset {0} does not belongs to the location {1},L'élément {0} n'appartient pas à l'emplacement {1}, +Asset Id,ID d'actif, +Asset Value,Valeur d'actif, +Asset Value Adjustment cannot be posted before Asset's purchase date {0}.,L'ajustement de la valeur de l'actif ne peut pas être enregistré avant la date d'achat de l'actif {0} ., +Asset {0} does not belongs to the custodian {1},L'élément {0} n'appartient pas au dépositaire {1}, +Asset {0} does not belongs to the location {1},L'élément {0} n'appartient pas à l'emplacement {1}, At least one of the Applicable Modules should be selected,Au moins un des modules applicables doit être sélectionné, Atleast one asset has to be selected.,Au moins un actif doit être sélectionné., Attendance Marked,Présence marquée, Attendance has been marked as per employee check-ins,La présence a été marquée selon les enregistrements des employés, Authentication Failed,Authentification échouée, Automatic Reconciliation,Rapprochement automatique, -Available For Use Date,Date d'utilisation disponible, +Available For Use Date,Date d'utilisation disponible, Available Stock,Stock disponible, "Available quantity is {0}, you need {1}",La quantité disponible est {0}. Vous avez besoin de {1}., BOM 1,BOM 1, BOM 2,BOM 2, BOM Comparison Tool,Outil de comparaison de nomenclature, BOM recursion: {0} cannot be child of {1},Récursion de nomenclature: {0} ne peut pas être enfant de {1}, -BOM recursion: {0} cannot be parent or child of {1},Récursion de nomenclature: {0} ne peut pas être le parent ou l'enfant de {1}, +BOM recursion: {0} cannot be parent or child of {1},Récursion de nomenclature: {0} ne peut pas être le parent ou l'enfant de {1}, Back to Home,De retour à la maison, Back to Messages,Retour aux messages, -Bank Data mapper doesn't exist,Bank Data Mapper n'existe pas, +Bank Data mapper doesn't exist,Bank Data Mapper n'existe pas, Bank Details,Coordonnées bancaires, -Bank account '{0}' has been synchronized,Le compte bancaire '{0}' a été synchronisé, -Bank account {0} already exists and could not be created again,Le compte bancaire {0} existe déjà et n'a pas pu être créé à nouveau., +Bank account '{0}' has been synchronized,Le compte bancaire '{0}' a été synchronisé, +Bank account {0} already exists and could not be created again,Le compte bancaire {0} existe déjà et n'a pas pu être créé à nouveau., Bank accounts added,Comptes bancaires ajoutés, -Batch no is required for batched item {0},Le numéro de lot est requis pour l'article en lot {0}., +Batch no is required for batched item {0},Le numéro de lot est requis pour l'article en lot {0}., Billing Date,Date de facturation, -Billing Interval Count cannot be less than 1,Le nombre d'intervalles de facturation ne peut pas être inférieur à 1, +Billing Interval Count cannot be less than 1,Le nombre d'intervalles de facturation ne peut pas être inférieur à 1, Blue,Bleu, Book,Livre, Book Appointment,Prendre rendez-vous, @@ -3730,18 +3730,18 @@ Browse,Feuilleter, Call Connected,Appel connecté, Call Disconnected,Appel déconnecté, Call Missed,Appel manqué, -Call Summary,Résumé d'appel, -Call Summary Saved,Résumé de l'appel enregistré, +Call Summary,Résumé d'appel, +Call Summary Saved,Résumé de l'appel enregistré, Cancelled,Annulé, -Cannot Calculate Arrival Time as Driver Address is Missing.,Impossible de calculer l'heure d'arrivée car l'adresse du conducteur est manquante., -Cannot Optimize Route as Driver Address is Missing.,Impossible d'optimiser l'itinéraire car l'adresse du pilote est manquante., +Cannot Calculate Arrival Time as Driver Address is Missing.,Impossible de calculer l'heure d'arrivée car l'adresse du conducteur est manquante., +Cannot Optimize Route as Driver Address is Missing.,Impossible d'optimiser l'itinéraire car l'adresse du pilote est manquante., "Cannot Unpledge, loan security value is greater than the repaid amount","Impossible de désengager, la valeur de la garantie de prêt est supérieure au montant remboursé", -Cannot complete task {0} as its dependant task {1} are not ccompleted / cancelled.,Impossible de terminer la tâche {0} car sa tâche dépendante {1} n'est pas terminée / annulée., -Cannot create loan until application is approved,Impossible de créer un prêt tant que la demande n'est pas approuvée, +Cannot complete task {0} as its dependant task {1} are not ccompleted / cancelled.,Impossible de terminer la tâche {0} car sa tâche dépendante {1} n'est pas terminée / annulée., +Cannot create loan until application is approved,Impossible de créer un prêt tant que la demande n'est pas approuvée, Cannot find a matching Item. Please select some other value for {0}.,Impossible de trouver un article similaire. Veuillez sélectionner une autre valeur pour {0}., "Cannot overbill for Item {0} in row {1} more than {2}. To allow over-billing, please set allowance in Accounts Settings","La surfacturation pour le poste {0} dans la ligne {1} ne peut pas dépasser {2}. Pour autoriser la surfacturation, définissez la provision dans les paramètres du compte.", Cannot unpledge more than {0} qty of {0},Impossible de retirer plus de {0} quantité de {0}, -"Capacity Planning Error, planned start time can not be same as end time","Erreur de planification de capacité, l'heure de début prévue ne peut pas être identique à l'heure de fin", +"Capacity Planning Error, planned start time can not be same as end time","Erreur de planification de capacité, l'heure de début prévue ne peut pas être identique à l'heure de fin", Categories,Catégories, Changes in {0},Changements dans {0}, Chart,Graphique, @@ -3751,26 +3751,26 @@ Close,Fermer, Communication,la communication, Compact Item Print,Impression de l'Article Compacté, Company,Société, -Company of asset {0} and purchase document {1} doesn't matches.,La société de l'actif {0} et le document d'achat {1} ne correspondent pas., +Company of asset {0} and purchase document {1} doesn't matches.,La société de l'actif {0} et le document d'achat {1} ne correspondent pas., Compare BOMs for changes in Raw Materials and Operations,Comparer les nomenclatures aux modifications apportées aux matières premières et aux opérations, Compare List function takes on list arguments,La fonction de comparaison de liste accepte les arguments de liste, Complete,Terminé, Completed,Terminé, Completed Quantity,Quantité terminée, -Connect your Exotel Account to ERPNext and track call logs,Connectez votre compte Exotel à ERPNext et suivez les journaux d'appels, +Connect your Exotel Account to ERPNext and track call logs,Connectez votre compte Exotel à ERPNext et suivez les journaux d'appels, Connect your bank accounts to ERPNext,Connectez vos comptes bancaires à ERPNext, Contact Seller,Contacter le vendeur, Continue,Continuer, -Cost Center: {0} does not exist,Centre de coûts: {0} n'existe pas, +Cost Center: {0} does not exist,Centre de coûts: {0} n'existe pas, Couldn't Set Service Level Agreement {0}.,Impossible de définir le contrat de service {0}., 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, Create New Contact,Créer un nouveau contact, Create New Lead,Créer une nouvelle piste, 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 bank entries...,Création d'entrées bancaires ..., +Creating bank entries...,Création d'entrées bancaires ..., Creating {0},Création de {0}, Credit limit is already defined for the Company {0},La limite de crédit est déjà définie pour la société {0}., Ctrl + Enter to submit,Ctrl + Entrée pour soumettre, @@ -3782,7 +3782,7 @@ Customize,Personnaliser, Daily,Quotidien, Date,Date, Date Range,Intervalle de Date, -Date of Birth cannot be greater than Joining Date.,La date de naissance ne peut pas être supérieure à la date d'adhésion., +Date of Birth cannot be greater than Joining Date.,La date de naissance ne peut pas être supérieure à la date d'adhésion., Dear,Cher/Chère, Default,Par Défaut, Define coupon codes.,Définissez les codes promo., @@ -3808,40 +3808,40 @@ Due Date,Date d'Échéance, Duplicate,Dupliquer, Duplicate Project with Tasks,Projet en double avec tâches, Duplicate project has been created,Un projet en double a été créé, -E-Way Bill JSON can only be generated from a submitted document,E-Way Bill JSON ne peut être généré qu'à partir d'un document soumis, -E-Way Bill JSON can only be generated from submitted document,E-Way Bill JSON ne peut être généré qu'à partir du document soumis, +E-Way Bill JSON can only be generated from a submitted document,E-Way Bill JSON ne peut être généré qu'à partir d'un document soumis, +E-Way Bill JSON can only be generated from submitted document,E-Way Bill JSON ne peut être généré qu'à partir du document soumis, E-Way Bill JSON cannot be generated for Sales Return as of now,La facture e-Way JSON ne peut pas être générée pour le retour de vente à partir de maintenant, -ERPNext could not find any matching payment entry,ERPNext n'a trouvé aucune entrée de paiement correspondante, +ERPNext could not find any matching payment entry,ERPNext n'a trouvé aucune entrée de paiement correspondante, Earliest Age,Âge le plus précoce, Edit Details,Modifier les détails, Edit Profile,Modifier le Profil, -Either GST Transporter ID or Vehicle No is required if Mode of Transport is Road,Un numéro d'identification de transporteur ou un numéro de véhicule est requis si le mode de transport est la route., +Either GST Transporter ID or Vehicle No is required if Mode of Transport is Road,Un numéro d'identification de transporteur ou un numéro de véhicule est requis si le mode de transport est la route., Email,Email, Email Campaigns,Campagnes de courrier électronique, -Employee ID is linked with another instructor,L'ID de l'employé est lié à un autre instructeur, +Employee ID is linked with another instructor,L'ID de l'employé est lié à un autre instructeur, Employee Tax and Benefits,Impôt et avantages sociaux des employés, -Employee is required while issuing Asset {0},L'employé est requis lors de l'émission de l'actif {0}, -Employee {0} does not belongs to the company {1},L'employé {0} n'appartient pas à l'entreprise {1}, +Employee is required while issuing Asset {0},L'employé est requis lors de l'émission de l'actif {0}, +Employee {0} does not belongs to the company {1},L'employé {0} n'appartient pas à l'entreprise {1}, Enable Auto Re-Order,Activer la re-commande automatique, -End Date of Agreement can't be less than today.,La date de fin de l'accord ne peut être inférieure à celle d'aujourd'hui., +End Date of Agreement can't be less than today.,La date de fin de l'accord ne peut être inférieure à celle d'aujourd'hui., End Time,Heure de fin, Energy Point Leaderboard,Point de classement énergétique, Enter API key in Google Settings.,Entrez la clé API dans les paramètres Google., Enter Supplier,Entrez le fournisseur, Enter Value,Entrez une valeur, -Entity Type,Type d'entité, +Entity Type,Type d'entité, Error,Erreur, Error in Exotel incoming call,Erreur dans un appel entrant Exotel, Error: {0} is mandatory field,Erreur: {0} est un champ obligatoire, -Event Link,Lien d'événement, -Exception occurred while reconciling {0},Une exception s'est produite lors de la réconciliation {0}, -Expected and Discharge dates cannot be less than Admission Schedule date,Les dates prévues et de sortie ne peuvent pas être inférieures à la date du calendrier d'admission, -Expire Allocation,Expiration de l'allocation, +Event Link,Lien d'événement, +Exception occurred while reconciling {0},Une exception s'est produite lors de la réconciliation {0}, +Expected and Discharge dates cannot be less than Admission Schedule date,Les dates prévues et de sortie ne peuvent pas être inférieures à la date du calendrier d'admission, +Expire Allocation,Expiration de l'allocation, Expired,Expiré, Export,Exporter, Export not allowed. You need {0} role to export.,Pas autorisé à exporter. Vous devez avoir le rôle {0} pour exporter., -Failed to add Domain,Impossible d'ajouter le domaine, -Fetch Items from Warehouse,Récupérer des articles de l'entrepôt, +Failed to add Domain,Impossible d'ajouter le domaine, +Fetch Items from Warehouse,Récupérer des articles de l'entrepôt, Fetching...,Aller chercher..., Field,Champ, File Manager,Gestionnaire de fichiers, @@ -3852,13 +3852,13 @@ Finished Qty,Quantité finie, Fleet Management,Gestion de flotte, Following fields are mandatory to create address:,Les champs suivants sont obligatoires pour créer une adresse:, For Month,Pour mois, -"For item {0} at row {1}, count of serial numbers does not match with the picked quantity","Pour l'élément {0} à la ligne {1}, le nombre de numéros de série ne correspond pas à la quantité sélectionnée.", -For operation {0}: Quantity ({1}) can not be greter than pending quantity({2}),Pour l'opération {0}: la quantité ({1}) ne peut pas être supérieure à la quantité en attente ({2}), -For quantity {0} should not be greater than work order quantity {1},Pour la quantité {0} ne doit pas être supérieure à la quantité d'ordre de travail {1}, +"For item {0} at row {1}, count of serial numbers does not match with the picked quantity","Pour l'élément {0} à la ligne {1}, le nombre de numéros de série ne correspond pas à la quantité sélectionnée.", +For operation {0}: Quantity ({1}) can not be greter than pending quantity({2}),Pour l'opération {0}: la quantité ({1}) ne peut pas être supérieure à la quantité en attente ({2}), +For quantity {0} should not be greater than work order quantity {1},Pour la quantité {0} ne doit pas être supérieure à la quantité d'ordre de travail {1}, Free item not set in the pricing rule {0},Article gratuit non défini dans la règle de tarification {0}, From Date and To Date are Mandatory,La date de début et la date de fin sont obligatoires, From date can not be greater than than To date,La date de début ne peut être supérieure à la date de fin, -From employee is required while receiving Asset {0} to a target location,De l'employé est requis lors de la réception de l'actif {0} vers un emplacement cible, +From employee is required while receiving Asset {0} to a target location,De l'employé est requis lors de la réception de l'actif {0} vers un emplacement cible, Fuel Expense,Frais de carburant, Future Payment Amount,Montant du paiement futur, Future Payment Ref,Paiement futur Ref, @@ -3880,27 +3880,27 @@ Help Article,Article d’Aide, "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, 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, In Progress,En cours, Incoming call from {0},Appel entrant du {0}, Incorrect Warehouse,Entrepôt incorrect, Interest Amount is mandatory,Le montant des intérêts est obligatoire, Intermediate,Intermédiaire, -Invalid Barcode. There is no Item attached to this barcode.,Code à barres invalide. Il n'y a pas d'article attaché à ce code à barres., -Invalid credentials,les informations d'identification invalides, +Invalid Barcode. There is no Item attached to this barcode.,Code à barres invalide. Il n'y a pas d'article attaché à ce code à barres., +Invalid credentials,les informations d'identification invalides, Invite as User,Inviter en tant qu'Utilisateur, -Issue Priority.,Priorité d'émission., +Issue Priority.,Priorité d'émission., Issue Type.,Type de probleme., "It seems that there is an issue with the server's stripe configuration. In case of failure, the amount will get refunded to your account.","Il semble qu'il y a un problème avec la configuration de Stripe sur le serveur. En cas d'erreur, le montant est remboursé sur votre compte.", Item Reported,Article rapporté, -Item listing removed,Liste d'articles supprimée, -Item quantity can not be zero,La quantité d'article ne peut être nulle, +Item listing removed,Liste d'articles supprimée, +Item quantity can not be zero,La quantité d'article ne peut être nulle, Item taxes updated,Taxes sur les articles mises à jour, Item {0}: {1} qty produced. ,Article {0}: {1} quantité produite., Items are required to pull the raw materials which is associated with it.,Les articles sont nécessaires pour extraire les matières premières qui lui sont associées., -Joining Date can not be greater than Leaving Date,La date d'adhésion ne peut pas être supérieure à la date de départ, -Lab Test Item {0} already exist,L'élément de test en laboratoire {0} existe déjà, +Joining Date can not be greater than Leaving Date,La date d'adhésion ne peut pas être supérieure à la date de départ, +Lab Test Item {0} already exist,L'élément de test en laboratoire {0} existe déjà, Last Issue,Dernier numéro, Latest Age,Dernier âge, Leave application is linked with leave allocations {0}. Leave application cannot be set as leave without pay,La demande de congé est liée aux allocations de congé {0}. Demande de congé ne peut pas être défini comme congé sans solde, @@ -3910,7 +3910,7 @@ Liabilities,Passifs, Loading...,Chargement en Cours ..., Loan Amount exceeds maximum loan amount of {0} as per proposed securities,Le montant du prêt dépasse le montant maximal du prêt de {0} selon les titres proposés, Loan Applications from customers and employees.,Demandes de prêt des clients et des employés., -Loan Disbursement,Déboursement de l'emprunt, +Loan Disbursement,Déboursement de l'emprunt, Loan Processes,Processus de prêt, Loan Security,Sécurité des prêts, Loan Security Pledge,Garantie de prêt, @@ -3922,7 +3922,7 @@ Loan Security Price,Prix de la sécurité du prêt, Loan Security Price overlapping with {0},Le prix du titre de crédit se chevauche avec {0}, Loan Security Unpledge,Désengagement de garantie de prêt, Loan Security Value,Valeur de la sécurité du prêt, -Loan Type for interest and penalty rates,Type de prêt pour les taux d'intérêt et de pénalité, +Loan Type for interest and penalty rates,Type de prêt pour les taux d'intérêt et de pénalité, Loan amount cannot be greater than {0},Le montant du prêt ne peut pas être supérieur à {0}, Loan is mandatory,Le prêt est obligatoire, Loans,Les prêts, @@ -3951,17 +3951,17 @@ New Payment,Nouveau paiement, New release date should be in the future,La nouvelle date de sortie devrait être dans le futur, Newsletter,Newsletter, No Account matched these filters: {},Aucun compte ne correspond à ces filtres: {}, -No Employee found for the given employee field value. '{}': {},Aucun employé trouvé pour la valeur de champ d'employé donnée. '{}': {}, -No Leaves Allocated to Employee: {0} for Leave Type: {1},Aucun congé attribué à l'employé: {0} pour le type de congé: {1}, +No Employee found for the given employee field value. '{}': {},Aucun employé trouvé pour la valeur de champ d'employé donnée. '{}': {}, +No Leaves Allocated to Employee: {0} for Leave Type: {1},Aucun congé attribué à l'employé: {0} pour le type de congé: {1}, No communication found.,Aucune communication trouvée., -No correct answer is set for {0},Aucune réponse correcte n'est définie pour {0}., +No correct answer is set for {0},Aucune réponse correcte n'est définie pour {0}., No description,Pas de description, -No issue has been raised by the caller.,Aucun problème n'a été soulevé par l'appelant., +No issue has been raised by the caller.,Aucun problème n'a été soulevé par l'appelant., No items to publish,Aucun élément à publier, No outstanding invoices found,Aucune facture en attente trouvée, -No outstanding invoices found for the {0} {1} which qualify the filters you have specified.,Aucune facture en attente n'a été trouvée pour le {0} {1} qui qualifie les filtres que vous avez spécifiés., +No outstanding invoices found for the {0} {1} which qualify the filters you have specified.,Aucune facture en attente n'a été trouvée pour le {0} {1} qui qualifie les filtres que vous avez spécifiés., No outstanding invoices require exchange rate revaluation,Aucune facture en attente ne nécessite une réévaluation du taux de change, -No reviews yet,Pas encore d'avis, +No reviews yet,Pas encore d'avis, No views yet,Pas encore de vue, Non stock items,Articles hors stock, Not Allowed,Non Autorisé, @@ -3970,25 +3970,25 @@ Not permitted. Please disable the Lab Test Template,Pas permis. Veuillez désact Note,Note, Notes: ,Remarques :, Offline,Hors ligne, -On Converting Opportunity,Sur l'opportunité de conversion, +On Converting Opportunity,Sur l'opportunité de conversion, On Purchase Order Submission,Sur soumission de commande, On Sales Order Submission,Envoi de commande client, On Task Completion,En fin de tâche, On {0} Creation,Sur {0} Creation, Only .csv and .xlsx files are supported currently,Seuls les fichiers .csv et .xlsx sont actuellement pris en charge., -Only expired allocation can be cancelled,Seule l'allocation expirée peut être annulée, +Only expired allocation can be cancelled,Seule l'allocation expirée peut être annulée, 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 Contact,Contact ouvert, Open Lead,Ouvrir le fil, Opening and Closing,Ouverture et fermeture, -Operating Cost as per Work Order / BOM,Coût d'exploitation selon l'ordre de travail / nomenclature, +Operating Cost as per Work Order / BOM,Coût d'exploitation selon l'ordre de travail / nomenclature, Order Amount,Montant de la commande, Page {0} of {1},Page {0} sur {1}, Paid amount cannot be less than {0},Le montant payé ne peut pas être inférieur à {0}, Parent Company must be a group company,La société mère doit être une société du groupe, Passing Score value should be between 0 and 100,La note de passage doit être comprise entre 0 et 100, -Password policy cannot contain spaces or simultaneous hyphens. The format will be restructured automatically,La politique de mot de passe ne peut pas contenir d'espaces ni de traits d'union simultanés. Le format sera restructuré automatiquement, +Password policy cannot contain spaces or simultaneous hyphens. The format will be restructured automatically,La politique de mot de passe ne peut pas contenir d'espaces ni de traits d'union simultanés. Le format sera restructuré automatiquement, Patient History,Histoire du patient, Pause,Pause, Pay,Payer, @@ -4001,39 +4001,39 @@ Period based On,Période basée sur, Perpetual inventory required for the company {0} to view this report.,Inventaire permanent requis pour que la société {0} puisse consulter ce rapport., Phone,Téléphone, Pick List,Liste de sélection, -Plaid authentication error,Erreur d'authentification du plaid, +Plaid authentication error,Erreur d'authentification du plaid, Plaid public token error,Erreur de jeton public Plaid, Plaid transactions sync error,Erreur de synchronisation des transactions plaid, -Please check the error log for details about the import errors,Veuillez consulter le journal des erreurs pour plus de détails sur les erreurs d'importation., +Please check the error log for details about the import errors,Veuillez consulter le journal des erreurs pour plus de détails sur les erreurs d'importation., Please click on the following link to set your new password,Veuillez cliquer sur le lien suivant pour définir votre nouveau mot de passe, -Please create DATEV Settings for Company {}.,Veuillez créer les paramètres DATEV pour l'entreprise {} ., -Please create adjustment Journal Entry for amount {0} ,Veuillez créer une écriture de journal d'ajustement pour le montant {0}, +Please create DATEV Settings for Company {}.,Veuillez créer les paramètres DATEV pour l'entreprise {} ., +Please create adjustment Journal Entry for amount {0} ,Veuillez créer une écriture de journal d'ajustement pour le montant {0}, Please do not create more than 500 items at a time,Ne créez pas plus de 500 objets à la fois., -Please enter Difference Account or set default Stock Adjustment Account for company {0},Veuillez saisir un compte d'écart ou définir un compte d'ajustement de stock par défaut pour la société {0}, -Please enter GSTIN and state for the Company Address {0},Veuillez saisir GSTIN et indiquer l'adresse de la société {0}., -Please enter Item Code to get item taxes,Veuillez entrer le code de l'article pour obtenir les taxes sur les articles, +Please enter Difference Account or set default Stock Adjustment Account for company {0},Veuillez saisir un compte d'écart ou définir un compte d'ajustement de stock par défaut pour la société {0}, +Please enter GSTIN and state for the Company Address {0},Veuillez saisir GSTIN et indiquer l'adresse de la société {0}., +Please enter Item Code to get item taxes,Veuillez entrer le code de l'article pour obtenir les taxes sur les articles, Please enter Warehouse and Date,Veuillez entrer entrepôt et date, -Please enter coupon code !!,S'il vous plaît entrer le code coupon !!, -Please enter the designation,S'il vous plaît entrer la désignation, +Please enter coupon code !!,S'il vous plaît entrer le code coupon !!, +Please enter the designation,S'il vous plaît entrer la désignation, Please enter valid coupon code !!,Veuillez entrer un code de coupon valide !!, -Please login as a Marketplace User to edit this item.,Veuillez vous connecter en tant qu'utilisateur Marketplace pour modifier cet article., -Please login as a Marketplace User to report this item.,Veuillez vous connecter en tant qu'utilisateur de la Marketplace pour signaler cet élément., +Please login as a Marketplace User to edit this item.,Veuillez vous connecter en tant qu'utilisateur Marketplace pour modifier cet article., +Please login as a Marketplace User to report this item.,Veuillez vous connecter en tant qu'utilisateur de la Marketplace pour signaler cet élément., Please select Template Type to download template,Veuillez sélectionner le type de modèle pour télécharger le modèle, -Please select Applicant Type first,Veuillez d'abord sélectionner le type de demandeur, -Please select Customer first,S'il vous plaît sélectionnez d'abord le client, -Please select Item Code first,Veuillez d'abord sélectionner le code d'article, +Please select Applicant Type first,Veuillez d'abord sélectionner le type de demandeur, +Please select Customer first,S'il vous plaît sélectionnez d'abord le client, +Please select Item Code first,Veuillez d'abord sélectionner le code d'article, Please select Loan Type for company {0},Veuillez sélectionner le type de prêt pour la société {0}, Please select a Delivery Note,Veuillez sélectionner un bon de livraison, -Please select a Sales Person for item: {0},Veuillez sélectionner un commercial pour l'article: {0}, +Please select a Sales Person for item: {0},Veuillez sélectionner un commercial pour l'article: {0}, Please select another payment method. Stripe does not support transactions in currency '{0}',Veuillez sélectionner une autre méthode de paiement. Stripe ne prend pas en charge les transactions en devise '{0}', -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 le bon de commande., 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 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 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 up the Campaign Schedule in the Campaign {0},Configurez le calendrier de la campagne dans la campagne {0}., -Please set valid GSTIN No. in Company Address for company {0},Veuillez définir un numéro GSTIN valide dans l'adresse de l'entreprise pour l'entreprise {0}, +Please set valid GSTIN No. in Company Address for company {0},Veuillez définir un numéro GSTIN valide dans l'adresse de l'entreprise pour l'entreprise {0}, Please set {0},Veuillez définir {0},customer Please setup a default bank account for company {0},Veuillez configurer un compte bancaire par défaut pour la société {0}., Please specify,Veuillez spécifier, @@ -4048,29 +4048,29 @@ Processing XML Files,Traitement des fichiers XML, Profitability,Rentabilité, Project,Projet, Proposed Pledges are mandatory for secured Loans,Les engagements proposés sont obligatoires pour les prêts garantis, -Provide the academic year and set the starting and ending date.,Indiquez l'année universitaire et définissez la date de début et de fin., +Provide the academic year and set the starting and ending date.,Indiquez l'année universitaire et définissez la date de début et de fin., Public token is missing for this bank,Un jeton public est manquant pour cette banque, Publish,Publier, Publish 1 Item,Publier 1 élément, Publish Items,Publier des articles, -Publish More Items,Publier plus d'articles, +Publish More Items,Publier plus d'articles, Publish Your First Items,Publiez vos premiers articles, Publish {0} Items,Publier {0} éléments, Published Items,Articles publiés, -Purchase Invoice cannot be made against an existing asset {0},La facture d'achat ne peut pas être effectuée sur un élément existant {0}, -Purchase Invoices,Factures d'achat, +Purchase Invoice cannot be made against an existing asset {0},La facture d'achat ne peut pas être effectuée sur un élément existant {0}, +Purchase Invoices,Factures d'achat, Purchase Orders,Acheter en ligne, Purchase Receipt doesn't have any Item for which Retain Sample is enabled.,Le reçu d’achat ne contient aucun élément pour lequel Conserver échantillon est activé., Purchase Return,Retour d'Achat, Qty of Finished Goods Item,Quantité de produits finis, Qty or Amount is mandatroy for loan security,La quantité ou le montant est obligatoire pour la garantie de prêt, -Quality Inspection required for Item {0} to submit,Inspection de qualité requise pour que l'élément {0} soit envoyé, +Quality Inspection required for Item {0} to submit,Inspection de qualité requise pour que l'élément {0} soit envoyé, Quantity to Manufacture,Quantité à fabriquer, -Quantity to Manufacture can not be zero for the operation {0},La quantité à fabriquer ne peut pas être nulle pour l'opération {0}, +Quantity to Manufacture can not be zero for the operation {0},La quantité à fabriquer ne peut pas être nulle pour l'opération {0}, Quarterly,Trimestriel, Queued,File d'Attente, Quick Entry,Écriture Rapide, -Quiz {0} does not exist,Le questionnaire {0} n'existe pas, +Quiz {0} does not exist,Le questionnaire {0} n'existe pas, Quotation Amount,Montant du devis, Rate or Discount is required for the price discount.,Le taux ou la remise est requis pour la remise de prix., Reason,Raison, @@ -4081,7 +4081,7 @@ Recruitment,Recrutement, Red,rouge, Refreshing,Rafraîchissant, Release date must be in the future,La date de sortie doit être dans le futur, -Relieving Date must be greater than or equal to Date of Joining,La date de libération doit être supérieure ou égale à la date d'adhésion, +Relieving Date must be greater than or equal to Date of Joining,La date de libération doit être supérieure ou égale à la date d'adhésion, Rename,Renommer, Rename Not Allowed,Renommer non autorisé, Repayment Method is mandatory for term loans,La méthode de remboursement est obligatoire pour les prêts à terme, @@ -4090,70 +4090,70 @@ Report Item,Élément de rapport, Report this Item,Signaler cet article, Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Quantité réservée pour la sous-traitance: quantité de matières premières pour fabriquer des articles sous-traités., Reset,Réinitialiser, -Reset Service Level Agreement,Réinitialiser l'accord de niveau de service, -Resetting Service Level Agreement.,Réinitialisation de l'accord de niveau de service., -Response Time for {0} at index {1} can't be greater than Resolution Time.,Le temps de réponse pour {0} à l'index {1} ne peut pas être supérieur au temps de résolution., +Reset Service Level Agreement,Réinitialiser l'accord de niveau de service, +Resetting Service Level Agreement.,Réinitialisation de l'accord de niveau de service., +Response Time for {0} at index {1} can't be greater than Resolution Time.,Le temps de réponse pour {0} à l'index {1} ne peut pas être supérieur au temps de résolution., Return amount cannot be greater unclaimed amount,Le montant du retour ne peut pas être supérieur au montant non réclamé, Review,La revue, Room,Chambre, Room Type,Type de chambre, Row # ,Ligne #, -Row #{0}: Accepted Warehouse and Supplier Warehouse cannot be same,Ligne # {0}: l'entrepôt accepté et l'entrepôt fournisseur ne peuvent pas être identiques, -Row #{0}: Cannot delete item {1} which has already been billed.,Ligne # {0}: impossible de supprimer l'élément {1} qui a déjà été facturé., -Row #{0}: Cannot delete item {1} which has already been delivered,Ligne # {0}: impossible de supprimer l'élément {1} qui a déjà été livré, -Row #{0}: Cannot delete item {1} which has already been received,Ligne # {0}: impossible de supprimer l'élément {1} qui a déjà été reçu, -Row #{0}: Cannot delete item {1} which has work order assigned to it.,Ligne # {0}: impossible de supprimer l'élément {1} auquel un bon de travail est affecté., -Row #{0}: Cannot delete item {1} which is assigned to customer's purchase order.,Ligne # {0}: impossible de supprimer l'article {1} affecté à la commande d'achat du client., -Row #{0}: Cannot select Supplier Warehouse while suppling raw materials to subcontractor,Ligne # {0}: Impossible de sélectionner l'entrepôt fournisseur lors de la fourniture de matières premières au sous-traitant, -Row #{0}: Cost Center {1} does not belong to company {2},Ligne # {0}: le centre de coûts {1} n'appartient pas à l'entreprise {2}, -Row #{0}: Operation {1} is not completed for {2} qty of finished goods in Work Order {3}. Please update operation status via Job Card {4}.,Ligne n ° {0}: l'opération {1} n'est pas terminée pour {2} quantité de produits finis dans l'ordre de travail {3}. Veuillez mettre à jour le statut de l'opération via la carte de travail {4}., +Row #{0}: Accepted Warehouse and Supplier Warehouse cannot be same,Ligne # {0}: l'entrepôt accepté et l'entrepôt fournisseur ne peuvent pas être identiques, +Row #{0}: Cannot delete item {1} which has already been billed.,Ligne # {0}: impossible de supprimer l'élément {1} qui a déjà été facturé., +Row #{0}: Cannot delete item {1} which has already been delivered,Ligne # {0}: impossible de supprimer l'élément {1} qui a déjà été livré, +Row #{0}: Cannot delete item {1} which has already been received,Ligne # {0}: impossible de supprimer l'élément {1} qui a déjà été reçu, +Row #{0}: Cannot delete item {1} which has work order assigned to it.,Ligne # {0}: impossible de supprimer l'élément {1} auquel un bon de travail est affecté., +Row #{0}: Cannot delete item {1} which is assigned to customer's purchase order.,Ligne # {0}: impossible de supprimer l'article {1} affecté à la commande d'achat du client., +Row #{0}: Cannot select Supplier Warehouse while suppling raw materials to subcontractor,Ligne # {0}: Impossible de sélectionner l'entrepôt fournisseur lors de la fourniture de matières premières au sous-traitant, +Row #{0}: Cost Center {1} does not belong to company {2},Ligne # {0}: le centre de coûts {1} n'appartient pas à l'entreprise {2}, +Row #{0}: Operation {1} is not completed for {2} qty of finished goods in Work Order {3}. Please update operation status via Job Card {4}.,Ligne n ° {0}: l'opération {1} n'est pas terminée pour {2} quantité de produits finis dans l'ordre de travail {3}. Veuillez mettre à jour le statut de l'opération via la carte de travail {4}., Row #{0}: Payment document is required to complete the transaction,Ligne n ° {0}: Un document de paiement est requis pour effectuer la transaction., -Row #{0}: Serial No {1} does not belong to Batch {2},Ligne # {0}: le numéro de série {1} n'appartient pas au lot {2}, +Row #{0}: Serial No {1} does not belong to Batch {2},Ligne # {0}: le numéro de série {1} n'appartient pas au lot {2}, Row #{0}: Service End Date cannot be before Invoice Posting Date,Ligne # {0}: la date de fin du service ne peut pas être antérieure à la date de validation de la facture, Row #{0}: Service Start Date cannot be greater than Service End Date,Ligne # {0}: la date de début du service ne peut pas être supérieure à la date de fin du service, Row #{0}: Service Start and End Date is required for deferred accounting,Ligne # {0}: la date de début et de fin du service est requise pour la comptabilité différée, -Row {0}: Invalid Item Tax Template for item {1},Ligne {0}: modèle de taxe sur les articles non valide pour l'article {1}, -Row {0}: Quantity not available for {4} in warehouse {1} at posting time of the entry ({2} {3}),Ligne {0}: quantité non disponible pour {4} dans l'entrepôt {1} au moment de la comptabilisation de l'entrée ({2} {3})., -Row {0}: user has not applied the rule {1} on the item {2},Ligne {0}: l'utilisateur n'a pas appliqué la règle {1} sur l'élément {2}, -Row {0}:Sibling Date of Birth cannot be greater than today.,Ligne {0}: la date de naissance du frère ou de la sœur ne peut pas être supérieure à celle d'aujourd'hui., +Row {0}: Invalid Item Tax Template for item {1},Ligne {0}: modèle de taxe sur les articles non valide pour l'article {1}, +Row {0}: Quantity not available for {4} in warehouse {1} at posting time of the entry ({2} {3}),Ligne {0}: quantité non disponible pour {4} dans l'entrepôt {1} au moment de la comptabilisation de l'entrée ({2} {3})., +Row {0}: user has not applied the rule {1} on the item {2},Ligne {0}: l'utilisateur n'a pas appliqué la règle {1} sur l'élément {2}, +Row {0}:Sibling Date of Birth cannot be greater than today.,Ligne {0}: la date de naissance du frère ou de la sœur ne peut pas être supérieure à celle d'aujourd'hui., Row({0}): {1} is already discounted in {2},Ligne ({0}): {1} est déjà réduit dans {2}., Rows Added in {0},Lignes ajoutées dans {0}, Rows Removed in {0},Lignes supprimées dans {0}, Sanctioned Amount limit crossed for {0} {1},Montant sanctionné dépassé pour {0} {1}, -Sanctioned Loan Amount already exists for {0} against company {1},Le montant du prêt sanctionné existe déjà pour {0} contre l'entreprise {1}, +Sanctioned Loan Amount already exists for {0} against company {1},Le montant du prêt sanctionné existe déjà pour {0} contre l'entreprise {1}, Save,sauvegarder, -Save Item,Enregistrer l'élément, +Save Item,Enregistrer l'élément, Saved Items,Articles sauvegardés, -Scheduled and Admitted dates can not be less than today,Les dates prévues et admises ne peuvent être inférieures à celles d'aujourd'hui, +Scheduled and Admitted dates can not be less than today,Les dates prévues et admises ne peuvent être inférieures à celles d'aujourd'hui, Search Items ...,Rechercher des articles ..., Search for a payment,Rechercher un paiement, -Search for anything ...,Rechercher n'importe quoi ..., +Search for anything ...,Rechercher n'importe quoi ..., Search results for,Résultats de recherche pour, Select All,Sélectionner Tout, Select Difference Account,Sélectionnez compte différentiel, Select a Default Priority.,Sélectionnez une priorité par défaut., Select a Supplier from the Default Supplier List of the items below.,Sélectionnez un fournisseur dans la liste des fournisseurs par défaut des éléments ci-dessous., Select a company,Sélectionnez une entreprise, -Select finance book for the item {0} at row {1},Sélectionnez le livre de financement pour l'élément {0} à la ligne {1}., +Select finance book for the item {0} at row {1},Sélectionnez le livre de financement pour l'élément {0} à la ligne {1}., Select only one Priority as Default.,Sélectionnez une seule priorité par défaut., Seller Information,Information du vendeur, Send,Envoyer, Send a message,Envoyer un message, Sending,Envoi, -Sends Mails to lead or contact based on a Campaign schedule,Envoie des courriers à diriger ou à contacter en fonction d'un calendrier de campagne, +Sends Mails to lead or contact based on a Campaign schedule,Envoie des courriers à diriger ou à contacter en fonction d'un calendrier de campagne, Serial Number Created,Numéro de série créé, Serial Numbers Created,Numéros de série créés, -Serial no(s) required for serialized item {0},N ° de série requis pour l'article sérialisé {0}, +Serial no(s) required for serialized item {0},N ° de série requis pour l'article sérialisé {0}, Series,Séries, Server Error,erreur du serveur, -Service Level Agreement has been changed to {0}.,L'accord de niveau de service a été remplacé par {0}., -Service Level Agreement tracking is not enabled.,Le suivi des accords de niveau de service n'est pas activé., -Service Level Agreement was reset.,L'accord de niveau de service a été réinitialisé., -Service Level Agreement with Entity Type {0} and Entity {1} already exists.,L'accord de niveau de service avec le type d'entité {0} et l'entité {1} existe déjà., +Service Level Agreement has been changed to {0}.,L'accord de niveau de service a été remplacé par {0}., +Service Level Agreement tracking is not enabled.,Le suivi des accords de niveau de service n'est pas activé., +Service Level Agreement was reset.,L'accord de niveau de service a été réinitialisé., +Service Level Agreement with Entity Type {0} and Entity {1} already exists.,L'accord de niveau de service avec le type d'entité {0} et l'entité {1} existe déjà., Set,Définir, Set Meta Tags,Définir les balises méta, -Set Response Time and Resolution for Priority {0} at index {1}.,Définissez le temps de réponse et la résolution pour la priorité {0} à l'index {1}., -Set {0} in company {1},Définissez {0} dans l'entreprise {1}, +Set Response Time and Resolution for Priority {0} at index {1}.,Définissez le temps de réponse et la résolution pour la priorité {0} à l'index {1}., +Set {0} in company {1},Définissez {0} dans l'entreprise {1}, Setup,Configuration, Setup Wizard,Assistant de configuration, Shift Management,Gestion des quarts, @@ -4163,10 +4163,10 @@ Show Sales Person,Afficher le vendeur, Show Stock Ageing Data,Afficher les données sur le vieillissement des stocks, Show Warehouse-wise Stock,Afficher le stock entre les magasins, Size,Taille, -Something went wrong while evaluating the quiz.,Quelque chose s'est mal passé lors de l'évaluation du quiz., +Something went wrong while evaluating the quiz.,Quelque chose s'est mal passé lors de l'évaluation du quiz., "Sorry,coupon code are exhausted","Désolé, le code de coupon est épuisé", "Sorry,coupon code validity has expired","Désolé, la validité du code promo a expiré", -"Sorry,coupon code validity has not started","Désolé, la validité du code promo n'a pas commencé", +"Sorry,coupon code validity has not started","Désolé, la validité du code promo n'a pas commencé", Sr,Sr, Start,Démarrer, Start Date cannot be before the current date,La date de début ne peut pas être antérieure à la date du jour, @@ -4178,32 +4178,32 @@ Stock Entry has been already created against this Pick List,Une entrée de stock Stock Ledger ID,ID du registre des stocks, Stock Value ({0}) and Account Balance ({1}) are out of sync for account {2} and it's linked warehouses.,La valeur du stock ({0}) et le solde du compte ({1}) ne sont pas synchronisés pour le compte {2} et ses entrepôts liés., Stores - {0},Magasins - {0}, -Student with email {0} does not exist,Étudiant avec le courrier électronique {0} n'existe pas, +Student with email {0} does not exist,Étudiant avec le courrier électronique {0} n'existe pas, Submit Review,Poster un commentaire, Submitted,Soumis, Supplier Addresses And Contacts,Adresses et contacts des fournisseurs, Synchronize this account,Synchroniser ce compte, Tag,Étiquette, -Target Location is required while receiving Asset {0} from an employee,L'emplacement cible est requis lors de la réception de l'élément {0} d'un employé, -Target Location is required while transferring Asset {0},L'emplacement cible est requis lors du transfert de l'élément {0}, -Target Location or To Employee is required while receiving Asset {0},L'emplacement cible ou l'employé est requis lors de la réception de l'élément {0}, +Target Location is required while receiving Asset {0} from an employee,L'emplacement cible est requis lors de la réception de l'élément {0} d'un employé, +Target Location is required while transferring Asset {0},L'emplacement cible est requis lors du transfert de l'élément {0}, +Target Location or To Employee is required while receiving Asset {0},L'emplacement cible ou l'employé est requis lors de la réception de l'élément {0}, Task's {0} End Date cannot be after Project's End Date.,La date de fin {0} de la tâche ne peut pas être postérieure à la date de fin du projet., Task's {0} Start Date cannot be after Project's End Date.,La date de début {0} de la tâche ne peut pas être postérieure à la date de fin du projet., Tax Account not specified for Shopify Tax {0},Compte de taxe non spécifié pour Shopify Tax {0}, Tax Total,Total de la taxe, Template,Modèle, -The Campaign '{0}' already exists for the {1} '{2}',La campagne '{0}' existe déjà pour le {1} '{2}'., +The Campaign '{0}' already exists for the {1} '{2}',La campagne '{0}' existe déjà pour le {1} '{2}'., The difference between from time and To Time must be a multiple of Appointment,La différence entre from time et To Time doit être un multiple de Appointment, -The field Asset Account cannot be blank,Le champ Compte d'actif ne peut pas être vide, +The field Asset Account cannot be blank,Le champ Compte d'actif ne peut pas être vide, The field Equity/Liability Account cannot be blank,Le champ Compte d’équité / de responsabilité ne peut pas être vide, The following serial numbers were created:

{0},Les numéros de série suivants ont été créés:

{0}, -The parent account {0} does not exists in the uploaded template,Le compte parent {0} n'existe pas dans le modèle téléchargé, +The parent account {0} does not exists in the uploaded template,Le compte parent {0} n'existe pas dans le modèle téléchargé, The question cannot be duplicate,La question ne peut pas être dupliquée, -The selected payment entry should be linked with a creditor bank transaction,L'entrée de paiement sélectionnée doit être liée à une transaction bancaire créditrice, -The selected payment entry should be linked with a debtor bank transaction,L'entrée de paiement sélectionnée doit être liée à une transaction bancaire débitrice, +The selected payment entry should be linked with a creditor bank transaction,L'entrée de paiement sélectionnée doit être liée à une transaction bancaire créditrice, +The selected payment entry should be linked with a debtor bank transaction,L'entrée de paiement sélectionnée doit être liée à une transaction bancaire débitrice, The total allocated amount ({0}) is greated than the paid amount ({1}).,Le montant total alloué ({0}) est supérieur au montant payé ({1})., The value {0} is already assigned to an exisiting Item {2}.,La valeur {0} est déjà attribuée à un élément existant {2}., -There are no vacancies under staffing plan {0},Il n'y a pas de postes vacants dans le plan de dotation en personnel {0}, +There are no vacancies under staffing plan {0},Il n'y a pas de postes vacants dans le plan de dotation en personnel {0}, This Service Level Agreement is specific to Customer {0},Cet accord de niveau de service est spécifique au client {0}., This action will unlink this account from any external service integrating ERPNext with your bank accounts. It cannot be undone. Are you certain ?,Cette action dissociera ce compte de tout service externe intégrant ERPNext avec vos comptes bancaires. Ça ne peut pas être défait. Êtes-vous sûr ?, This bank account is already synchronized,Ce compte bancaire est déjà synchronisé, @@ -4219,7 +4219,7 @@ Title,Titre, To date needs to be before from date,À ce jour doit être avant la date du, Total,Total, Total Early Exits,Total des sorties anticipées, -Total Late Entries,Nombre total d'entrées en retard, +Total Late Entries,Nombre total d'entrées en retard, Total Payment Request amount cannot be greater than {0} amount,Le montant total de la demande de paiement ne peut être supérieur à {0}., Total payments amount can't be greater than {},Le montant total des paiements ne peut être supérieur à {}, Totals,Totaux, @@ -4230,8 +4230,8 @@ Transport Receipt No and Date are mandatory for your chosen Mode of Transport,Le Tuesday,Mardi, Type,Type, Unable to find Salary Component {0},Impossible de trouver la composante salaire {0}, -Unable to find the time slot in the next {0} days for the operation {1}.,Impossible de trouver l'intervalle de temps dans les {0} jours suivants pour l'opération {1}., -Unable to update remote activity,Impossible de mettre à jour l'activité à distance, +Unable to find the time slot in the next {0} days for the operation {1}.,Impossible de trouver l'intervalle de temps dans les {0} jours suivants pour l'opération {1}., +Unable to update remote activity,Impossible de mettre à jour l'activité à distance, Unknown Caller,Appelant inconnu, Unlink external integrations,Dissocier les intégrations externes, Unmarked Attendance for days,Présence non marquée pendant des jours, @@ -4241,7 +4241,7 @@ Unsupported GST Category for E-Way Bill JSON generation,Catégorie GST non prise Update,Mettre à Jour, Update Details,Détails de mise à jour, Update Taxes for Items,Mettre à jour les taxes pour les articles, -"Upload a bank statement, link or reconcile a bank account","Télécharger un relevé bancaire, un lien ou un rapprochement d'un compte bancaire", +"Upload a bank statement, link or reconcile a bank account","Télécharger un relevé bancaire, un lien ou un rapprochement d'un compte bancaire", Upload a statement,Télécharger une déclaration, Use a name that is different from previous project name,Utilisez un nom différent du nom du projet précédent, User {0} is disabled,Utilisateur {0} est désactivé, @@ -4249,7 +4249,7 @@ Users and Permissions,Utilisateurs et autorisations, Vacancies cannot be lower than the current openings,Les postes vacants ne peuvent pas être inférieurs aux ouvertures actuelles, Valid From Time must be lesser than Valid Upto Time.,La période de validité doit être inférieure à la durée de validité., Valuation Rate required for Item {0} at row {1},Taux de valorisation requis pour le poste {0} à la ligne {1}, -"Valuation rate not found for the Item {0}, which is required to do accounting entries for {1} {2}. If the item is transacting as a zero valuation rate item in the {1}, please mention that in the {1} Item table. Otherwise, please create an incoming stock transaction for the item or mention valuation rate in the Item record, and then try submiting / cancelling this entry.","Taux de valorisation non trouvé pour le poste {0}, nécessaire pour effectuer les écritures comptables pour {1} {2}. Si l'élément effectue une transaction en tant qu'élément à taux d'évaluation zéro dans {1}, veuillez l'indiquer dans le tableau {1} Article. Sinon, créez une transaction de stock entrante pour l'article ou indiquez le taux de valorisation dans l'enregistrement de l'article, puis essayez de soumettre / annuler cette entrée.", +"Valuation rate not found for the Item {0}, which is required to do accounting entries for {1} {2}. If the item is transacting as a zero valuation rate item in the {1}, please mention that in the {1} Item table. Otherwise, please create an incoming stock transaction for the item or mention valuation rate in the Item record, and then try submiting / cancelling this entry.","Taux de valorisation non trouvé pour le poste {0}, nécessaire pour effectuer les écritures comptables pour {1} {2}. Si l'élément effectue une transaction en tant qu'élément à taux d'évaluation zéro dans {1}, veuillez l'indiquer dans le tableau {1} Article. Sinon, créez une transaction de stock entrante pour l'article ou indiquez le taux de valorisation dans l'enregistrement de l'article, puis essayez de soumettre / annuler cette entrée.", Values Out Of Sync,Valeurs désynchronisées, Vehicle Type is required if Mode of Transport is Road,Le type de véhicule est requis si le mode de transport est la route, Vendor Name,Nom du vendeur, @@ -4261,21 +4261,21 @@ Warehouse,Entrepôt, Warehouse not found against the account {0},Entrepôt introuvable sur le compte {0}, Welcome to {0},Bienvenue sur {0}, Why do think this Item should be removed?,Pourquoi pensez-vous que cet élément devrait être supprimé?, -Work Order {0}: Job Card not found for the operation {1},Bon de travail {0}: carte de travail non trouvée pour l'opération {1}, +Work Order {0}: Job Card not found for the operation {1},Bon de travail {0}: carte de travail non trouvée pour l'opération {1}, Workday {0} has been repeated.,La journée de travail {0} a été répétée., XML Files Processed,Fichiers XML traités, Year,Année, Yearly,Annuel, You,Vous, -You are not allowed to enroll for this course,Vous n'êtes pas autorisé à vous inscrire à ce cours, -You are not enrolled in program {0},Vous n'êtes pas inscrit au programme {0}, -You can Feature upto 8 items.,Vous pouvez présenter jusqu'à 8 éléments., +You are not allowed to enroll for this course,Vous n'êtes pas autorisé à vous inscrire à ce cours, +You are not enrolled in program {0},Vous n'êtes pas inscrit au programme {0}, +You can Feature upto 8 items.,Vous pouvez présenter jusqu'à 8 éléments., You can also copy-paste this link in your browser,Vous pouvez également copier-coller ce lien dans votre navigateur, -You can publish upto 200 items.,Vous pouvez publier jusqu'à 200 articles., -You can't create accounting entries in the closed accounting period {0},Vous ne pouvez pas créer d'écritures comptables dans la période comptable clôturée {0}., +You can publish upto 200 items.,Vous pouvez publier jusqu'à 200 articles., +You can't create accounting entries in the closed accounting period {0},Vous ne pouvez pas créer d'écritures comptables dans la période comptable clôturée {0}., You have to enable auto re-order in Stock Settings to maintain re-order levels.,Vous devez activer la re-commande automatique dans les paramètres de stock pour maintenir les niveaux de ré-commande., You must be a registered supplier to generate e-Way Bill,Vous devez être un fournisseur enregistré pour générer une facture électronique, -You need to login as a Marketplace User before you can add any reviews.,Vous devez vous connecter en tant qu'utilisateur de la Marketplace avant de pouvoir ajouter des critiques., +You need to login as a Marketplace User before you can add any reviews.,Vous devez vous connecter en tant qu'utilisateur de la Marketplace avant de pouvoir ajouter des critiques., Your Featured Items,Vos articles en vedette, Your Items,Vos articles, Your Profile,Votre profil, @@ -4291,9 +4291,9 @@ woocommerce - {0},woocommerce - {0}, {0} bank transaction(s) created and {1} errors,{0} transaction (s) bancaire (s) créée (s) et {1} erreur (s), {0} can not be greater than {1},{0} ne peut pas être supérieur à {1}, {0} conversations,{0} conversations, -{0} is not a company bank account,{0} n'est pas un compte bancaire d'entreprise, -{0} is not a group node. Please select a group node as parent cost center,{0} n'est pas un nœud de groupe. Veuillez sélectionner un nœud de groupe comme centre de coûts parent, -{0} is not the default supplier for any items.,{0} n'est le fournisseur par défaut d'aucun élément., +{0} is not a company bank account,{0} n'est pas un compte bancaire d'entreprise, +{0} is not a group node. Please select a group node as parent cost center,{0} n'est pas un nœud de groupe. Veuillez sélectionner un nœud de groupe comme centre de coûts parent, +{0} is not the default supplier for any items.,{0} n'est le fournisseur par défaut d'aucun élément., {0} is required,{0} est nécessaire, {0} units of {1} is not available.,{0} unités de {1} ne sont pas disponibles., {0}: {1} must be less than {2},{0}: {1} doit être inférieur à {2}, @@ -4329,7 +4329,7 @@ Loan Amount is mandatory,Le montant du prêt est obligatoire, Mode Of Payment,Mode de Paiement, No students Found,Aucun étudiant trouvé, Not in Stock,En Rupture de Stock, -Please select a Customer,S'il vous plaît sélectionner un client, +Please select a Customer,S'il vous plaît sélectionner un client, Printed On,Imprimé sur, Received From,Reçu de, Sales Person,Vendeur, @@ -4339,7 +4339,7 @@ Write Off,Reprise, Email Id,Identifiant Email, No,Non, Reference Doctype,DocType de la Référence, -User Id,Identifiant d'utilisateur, +User Id,Identifiant d'utilisateur, Yes,Oui, Actual ,Réel, Add to cart,Ajouter au Panier, @@ -4370,7 +4370,7 @@ Open Projects ,Projets ouverts, Open To Do ,ToDo ouvertes, Operation Id,ID de l'Opération, Partially ordered,Partiellement Ordonné, -Please select company first,Sélectionnez d'abord l'entreprise, +Please select company first,Sélectionnez d'abord l'entreprise, Please select patient,Veuillez sélectionner un patient, Printed On ,Imprimé sur, Projected qty,Qté Projetée, @@ -4378,7 +4378,7 @@ Sales person,Vendeur, Serial No {0} Created,N° de Série {0} créé, Set as default,Définir par défaut, Source Location is required for the Asset {0},La localisation source est requis pour l'actif {0}, -Tax Id,Numéro d'identification fiscale, +Tax Id,Numéro d'identification fiscale, To Time,Horaire de Fin, To date cannot be before from date,À ce jour ne peut pas être antérieure à la date du, Total Taxable value,Valeur taxable totale, @@ -4394,19 +4394,19 @@ to,à, Cards,Cartes, Percentage,Pourcentage, Failed to setup defaults for country {0}. Please contact support@erpnext.com,Échec de la configuration des paramètres par défaut pour le pays {0}. Veuillez contacter support@erpnext.com, -Row #{0}: Item {1} is not a Serialized/Batched Item. It cannot have a Serial No/Batch No against it.,Ligne # {0}: l'article {1} n'est pas un article sérialisé / en lot. Il ne peut pas avoir de numéro de série / de lot contre lui., +Row #{0}: Item {1} is not a Serialized/Batched Item. It cannot have a Serial No/Batch No against it.,Ligne # {0}: l'article {1} n'est pas un article sérialisé / en lot. Il ne peut pas avoir de numéro de série / de lot contre lui., Please set {0},Veuillez définir {0}, Please set {0},Veuillez définir {0},supplier Draft,Brouillon,"docstatus,=,0" Cancelled,Annulé,"docstatus,=,2" -Please setup Instructor Naming System in Education > Education Settings,Veuillez configurer le système de dénomination de l'instructeur dans Éducation> Paramètres de l'éducation, +Please setup Instructor Naming System in Education > Education Settings,Veuillez configurer le système de dénomination de l'instructeur dans Éducation> Paramètres de l'éducation, Please set Naming Series for {0} via Setup > Settings > Naming Series,Veuillez définir la série de noms pour {0} via Configuration> Paramètres> Série de noms, -UOM Conversion factor ({0} -> {1}) not found for item: {2},Facteur de conversion UdM ({0} -> {1}) introuvable pour l'article: {2}, -Item Code > Item Group > Brand,Code article> Groupe d'articles> Marque, +UOM Conversion factor ({0} -> {1}) not found for item: {2},Facteur de conversion UdM ({0} -> {1}) introuvable pour l'article: {2}, +Item Code > Item Group > Brand,Code article> Groupe d'articles> Marque, Customer > Customer Group > Territory,Client> Groupe de clients> Territoire, Supplier > Supplier Type,Fournisseur> Type de fournisseur, Please setup Employee Naming System in Human Resource > HR Settings,Veuillez configurer le système de dénomination des employés dans Ressources humaines> Paramètres RH, -Please setup numbering series for Attendance via Setup > Numbering Series,Veuillez configurer la série de numérotation pour l'assistance via Configuration> Série de numérotation, +Please setup numbering series for Attendance via Setup > Numbering Series,Veuillez configurer la série de numérotation pour l'assistance via Configuration> Série de numérotation, Purchase Order Required,Bon de Commande Requis, Purchase Receipt Required,Reçu d’Achat Requis, Requested,Demandé, @@ -4462,7 +4462,7 @@ Accounts Frozen Upto,Comptes Gelés Jusqu'au, "Accounting entry frozen up to this date, nobody can do / modify entry except role specified below.","Les écritures comptables sont gelées jusqu'à cette date, personne ne peut ajouter / modifier les entrées sauf les rôles spécifiés ci-dessous.", Role Allowed to Set Frozen Accounts & Edit Frozen Entries,Rôle Autorisé à Geler des Comptes & à Éditer des Écritures Gelées, Users with this role are allowed to set frozen accounts and create / modify accounting entries against frozen accounts,Les utilisateurs ayant ce rôle sont autorisés à définir les comptes gelés et à créer / modifier des écritures comptables sur des comptes gelés, -Determine Address Tax Category From,Déterminer la catégorie de taxe d'adresse à partir de, +Determine Address Tax Category From,Déterminer la catégorie de taxe d'adresse à partir de, Address used to determine Tax Category in transactions.,Adresse utilisée pour déterminer la catégorie de taxe dans les transactions., Over Billing Allowance (%),Frais de facturation excédentaires (%), Percentage you are allowed to bill more against the amount ordered. For example: If the order value is $100 for an item and tolerance is set as 10% then you are allowed to bill for $110.,"Pourcentage vous êtes autorisé à facturer plus par rapport au montant commandé. Par exemple: Si la valeur de la commande est de 100 USD pour un article et que la tolérance est définie sur 10%, vous êtes autorisé à facturer 110 USD.", @@ -4471,14 +4471,14 @@ Role that is allowed to submit transactions that exceed credit limits set.,Rôle Check Supplier Invoice Number Uniqueness,Vérifiez l'Unicité du Numéro de Facture du Fournisseur, Make Payment via Journal Entry,Effectuer un Paiement par une Écriture de Journal, Unlink Payment on Cancellation of Invoice,Délier Paiement à l'Annulation de la Facture, -Unlink Advance Payment on Cancelation of Order,Dissocier le paiement anticipé lors de l'annulation d'une commande, +Unlink Advance Payment on Cancelation of Order,Dissocier le paiement anticipé lors de l'annulation d'une commande, Book Asset Depreciation Entry Automatically,Comptabiliser les Entrées de Dépréciation d'Actifs Automatiquement, Allow Cost Center In Entry of Balance Sheet Account,Autoriser le centre de coûts en saisie du compte de bilan, Automatically Add Taxes and Charges from Item Tax Template,Ajouter automatiquement des taxes et des frais à partir du modèle de taxe à la pièce, Automatically Fetch Payment Terms,Récupérer automatiquement les conditions de paiement, Show Inclusive Tax In Print,Afficher la taxe inclusive en impression, Show Payment Schedule in Print,Afficher le calendrier de paiement dans Imprimer, -Currency Exchange Settings,Paramètres d'échange de devises, +Currency Exchange Settings,Paramètres d'échange de devises, Allow Stale Exchange Rates,Autoriser les Taux de Change Existants, Stale Days,Journées Passées, Report Settings,Paramètres de rapport, @@ -4489,20 +4489,20 @@ Branch Code,Code de la branche, Address and Contact,Adresse et Contact, Address HTML,Adresse HTML, Contact HTML,HTML du Contact, -Data Import Configuration,Configuration de l'importation de données, +Data Import Configuration,Configuration de l'importation de données, Bank Transaction Mapping,Cartographie des transactions bancaires, -Plaid Access Token,Jeton d'accès plaid, -Company Account,Compte d'entreprise, +Plaid Access Token,Jeton d'accès plaid, +Company Account,Compte d'entreprise, Account Subtype,Sous-type de compte, Is Default Account,Est un compte par défaut, -Is Company Account,Est le compte de l'entreprise, +Is Company Account,Est le compte de l'entreprise, Party Details,Parti Détails, Account Details,Détails du compte, IBAN,IBAN, Bank Account No,No de compte bancaire, -Integration Details,Détails d'intégration, -Integration ID,ID d'intégration, -Last Integration Date,Dernière date d'intégration, +Integration Details,Détails d'intégration, +Integration ID,ID d'intégration, +Last Integration Date,Dernière date d'intégration, Change this date manually to setup the next synchronization start date,Modifiez cette date manuellement pour définir la prochaine date de début de la synchronisation., Mask,Masque, Bank Guarantee,Garantie Bancaire, @@ -4609,7 +4609,7 @@ POS-CLO-,POS-CLO-, Custody,Garde, Net Amount,Montant Net, Cashier Closing Payments,Paiements de clôture du caissier, -Import Chart of Accounts from a csv file,Importer un tableau de comptes à partir d'un fichier csv, +Import Chart of Accounts from a csv file,Importer un tableau de comptes à partir d'un fichier csv, Attach custom Chart of Accounts file,Joindre un fichier de plan comptable personnalisé, Chart Preview,Aperçu du graphique, Chart Tree,Arbre à cartes, @@ -4641,7 +4641,7 @@ lft,Lft, rgt,rgt, Coupon Code,Code de coupon, Coupon Name,Nom du coupon, -"e.g. ""Summer Holiday 2019 Offer 20""",ex. "Offre vacances d'été 2019 20", +"e.g. ""Summer Holiday 2019 Offer 20""",ex. "Offre vacances d'été 2019 20", Coupon Type,Type de coupon, Promotional,Promotionnel, Gift Card,Carte cadeau, @@ -4692,9 +4692,9 @@ Bank Charges Account,Compte de frais bancaires, Accounts Receivable Credit Account,Compte de crédit débiteur, Accounts Receivable Discounted Account,Compte escompté des comptes débiteurs, Accounts Receivable Unpaid Account,Comptes débiteurs non payés, -Item Tax Template,Modèle de taxe d'article, -Tax Rates,Les taux d'imposition, -Item Tax Template Detail,Détail du modèle de taxe d'article, +Item Tax Template,Modèle de taxe d'article, +Tax Rates,Les taux d'imposition, +Item Tax Template Detail,Détail du modèle de taxe d'article, Entry Type,Type d'Écriture, Inter Company Journal Entry,Ecriture de journal inter-sociétés, Bank Entry,Écriture Bancaire, @@ -4730,7 +4730,7 @@ Debit in Company Currency,Débit en Devise Société, Credit in Company Currency,Crédit dans la Devise de la Société, Payroll Entry,Entrée de la paie, Employee Advance,Avance versée aux employés, -Reference Due Date,Date d'échéance de référence, +Reference Due Date,Date d'échéance de référence, Loyalty Program Tier,Echelon de programme de fidélité, Redeem Against,Échanger contre, Expiry Date,Date d'expiration, @@ -4748,8 +4748,8 @@ Collection Rules,Règles de collecte, Redemption,Echange, Conversion Factor,Facteur de Conversion, 1 Loyalty Points = How much base currency?,1 point de fidélité = Quel montant en devise de base ?, -Expiry Duration (in days),Durée d'expiration (en jours), -Help Section,Section d'aide, +Expiry Duration (in days),Durée d'expiration (en jours), +Help Section,Section d'aide, Loyalty Program Help,Aide au programme de fidélité, Loyalty Program Collection,Collecte du programme de fidélité, Tier Name,Nom de l'échelon, @@ -4767,17 +4767,17 @@ Monthly Distribution Percentage,Pourcentage de Répartition Mensuelle, Percentage Allocation,Allocation en Pourcentage, Create Missing Party,Créer les tiers manquants, Create missing customer or supplier.,Créer les clients ou les fournisseurs manquant, -Opening Invoice Creation Tool Item,Ouverture d'un outil de création de facture, +Opening Invoice Creation Tool Item,Ouverture d'un outil de création de facture, Temporary Opening Account,Compte temporaire d'ouverture, Party Account,Compte de Tiers, Type of Payment,Type de Paiement, ACC-PAY-.YYYY.-,ACC-PAY-YYYY.-, Receive,Recevoir, Internal Transfer,Transfert Interne, -Payment Order Status,État de l'ordre de paiement, +Payment Order Status,État de l'ordre de paiement, Payment Ordered,Paiement commandé, Payment From / To,Paiement De / À, -Company Bank Account,Compte bancaire de l'entreprise, +Company Bank Account,Compte bancaire de l'entreprise, Party Bank Account,Compte bancaire du parti, Account Paid From,Compte Payé Du, Account Paid To,Compte Payé Au, @@ -4802,8 +4802,8 @@ Payment Gateway Account,Compte Passerelle de Paiement, Payment Account,Compte de Paiement, Default Payment Request Message,Message de Demande de Paiement par Défaut, PMO-,PMO-, -Payment Order Type,Type d'ordre de paiement, -Payment Order Reference,Référence de l'ordre de paiement, +Payment Order Type,Type d'ordre de paiement, +Payment Order Reference,Référence de l'ordre de paiement, Bank Account Details,Détails de compte en banque, Payment Reconciliation,Réconciliation des Paiements, Receivable / Payable Account,Compte Débiteur / Créditeur, @@ -4822,14 +4822,14 @@ Payment Reconciliation Payment,Paiement de Réconciliation des Paiements, Reference Row,Ligne de Référence, Allocated amount,Montant alloué, Payment Request Type,Type de demande de paiement, -Outward,À l'extérieur, -Inward,Vers l'intérieur, +Outward,À l'extérieur, +Inward,Vers l'intérieur, ACC-PRQ-.YYYY.-,ACC-PRQ-.AAAA.-, Transaction Details,détails de la transaction, Amount in customer's currency,Montant dans la devise du client, Is a Subscription,Est un abonnement, Transaction Currency,Devise de la Transaction, -Subscription Plans,Plans d'abonnement, +Subscription Plans,Plans d'abonnement, SWIFT Number,Numéro SWIFT, Recipient Message And Payment Details,Message du Destinataire et Détails de Paiement, Make Sales Invoice,Faire des Factures de Vente, @@ -4840,7 +4840,7 @@ Payment Schedule,Calendrier de paiement, Invoice Portion,Pourcentage de facturation, Payment Amount,Montant du paiement, Payment Term Name,Nom du terme de paiement, -Due Date Based On,Date d'échéance basée sur, +Due Date Based On,Date d'échéance basée sur, Day(s) after invoice date,Jour (s) après la date de la facture, Day(s) after the end of the invoice month,Jour (s) après la fin du mois de facture, Month(s) after the end of the invoice month,Mois (s) après la fin du mois de la facture, @@ -4859,12 +4859,12 @@ Update Stock,Mettre à Jour le Stock, Ignore Pricing Rule,Ignorez Règle de Prix, Allow user to edit Rate,Autoriser l'utilisateur à modifier le Taux, Allow user to edit Discount,Autoriser l'utilisateur à modifier la remise, -Allow Print Before Pay,Autoriser l'impression avant la paie, +Allow Print Before Pay,Autoriser l'impression avant la paie, Display Items In Stock,Afficher les articles en stock, Applicable for Users,Applicable aux Utilisateurs, Sales Invoice Payment,Paiement de la Facture de Vente, -Item Groups,Groupes d'articles, -Only show Items from these Item Groups,Afficher uniquement les éléments de ces groupes d'éléments, +Item Groups,Groupes d'articles, +Only show Items from these Item Groups,Afficher uniquement les éléments de ces groupes d'éléments, Customer Groups,Groupes de Clients, Only show Customer of these Customer Groups,Afficher uniquement les clients de ces groupes de clients, Print Format for Online,Format d'Impression en Ligne, @@ -4878,8 +4878,8 @@ POS Profile User,Utilisateur du profil PDV, Use POS in Offline Mode,Utiliser PDV en Mode Hors-Ligne, Apply On,Appliquer Sur, Price or Product Discount,Prix ou remise de produit, -Apply Rule On Item Code,Appliquer la règle sur le code d'article, -Apply Rule On Item Group,Appliquer une règle sur un groupe d'articles, +Apply Rule On Item Code,Appliquer la règle sur le code d'article, +Apply Rule On Item Group,Appliquer une règle sur un groupe d'articles, Apply Rule On Brand,Appliquer la règle sur la marque, Mixed Conditions,Conditions mixtes, Conditions will be applied on all the selected items combined. ,Des conditions seront appliquées sur tous les éléments sélectionnés combinés., @@ -4906,7 +4906,7 @@ Product Discount Scheme,Schéma de remise de produit, Same Item,Même article, Free Item,Article gratuit, Threshold for Suggestion,Seuil de suggestion, -System will notify to increase or decrease quantity or amount ,Le système notifiera d'augmenter ou de diminuer la quantité ou le montant, +System will notify to increase or decrease quantity or amount ,Le système notifiera d'augmenter ou de diminuer la quantité ou le montant, "Higher the number, higher the priority","Plus le nombre est grand, plus la priorité est haute", Apply Multiple Pricing Rules,Appliquer plusieurs règles de tarification, Apply Discount on Rate,Appliquer une réduction sur le taux, @@ -4917,7 +4917,7 @@ Promotional Scheme Id,Id de schéma promotionnel, Promotional Scheme,Schéma promotionnel, Pricing Rule Brand,Marque de règle de tarification, Pricing Rule Detail,Détail de la règle de tarification, -Child Docname,Nom de l'enfant, +Child Docname,Nom de l'enfant, Rule Applied,Règle appliquée, Pricing Rule Item Code,Règle de tarification Article Code, Pricing Rule Item Group,Groupe de postes de règle de tarification, @@ -4933,7 +4933,7 @@ Tax Withholding Category,Catégorie de taxation à la source, Edit Posting Date and Time,Modifier la Date et l'Heure de la Publication, Is Paid,Est Payé, Is Return (Debit Note),Est une note de débit, -Apply Tax Withholding Amount,Appliquer le montant de la retenue d'impôt, +Apply Tax Withholding Amount,Appliquer le montant de la retenue d'impôt, Accounting Dimensions ,Dimensions comptables, Supplier Invoice Details,Détails de la Facture du Fournisseur, Supplier Invoice Date,Date de la Facture du Fournisseur, @@ -5021,7 +5021,7 @@ Is Fixed Asset,Est Immobilisation, Asset Location,Localisation de l'actif, Deferred Expense,Frais différés, Deferred Expense Account,Compte de dépenses différées, -Service Stop Date,Date d'arrêt du service, +Service Stop Date,Date d'arrêt du service, Enable Deferred Expense,Activer les frais reportés, Service Start Date,Date de début du service, Service End Date,Date de fin du service, @@ -5029,8 +5029,8 @@ Allow Zero Valuation Rate,Autoriser un Taux de Valorisation Égal à Zéro, Item Tax Rate,Taux de la Taxe sur l'Article, Tax detail table fetched from item master as a string and stored in this field.\nUsed for Taxes and Charges,La table de détails de taxe est récupérée depuis les données de base de l'article comme une chaîne de caractères et stockée dans ce champ. Elle est utilisée pour les Taxes et Frais., Purchase Order Item,Article du Bon de Commande, -Purchase Receipt Detail,Détail du reçu d'achat, -Item Weight Details,Détails du poids de l'article, +Purchase Receipt Detail,Détail du reçu d'achat, +Item Weight Details,Détails du poids de l'article, Weight Per Unit,Poids par unité, Total Weight,Poids total, Weight UOM,UDM de Poids, @@ -5042,7 +5042,7 @@ Add or Deduct,Ajouter ou Déduire, Deduct,Déduire, On Previous Row Amount,Le Montant de la Rangée Précédente, On Previous Row Total,Le Total de la Rangée Précédente, -On Item Quantity,Sur quantité d'article, +On Item Quantity,Sur quantité d'article, Reference Row #,Ligne de Référence #, Is this Tax included in Basic Rate?,Cette Taxe est-elle incluse dans le Taux de Base ?, "If checked, the tax amount will be considered as already included in the Print Rate / Print Amount","Si cochée, le montant de la taxe sera considéré comme déjà inclus dans le Taux d'Impression / Prix d'Impression", @@ -5104,7 +5104,7 @@ Qty as per Stock UOM,Qté par UDM du Stock, Discount and Margin,Remise et Marge, Rate With Margin,Tarif Avec Marge, Discount (%) on Price List Rate with Margin,Remise (%) sur le Tarif de la Liste de Prix avec la Marge, -Rate With Margin (Company Currency),Taux avec marge (devise de l'entreprise), +Rate With Margin (Company Currency),Taux avec marge (devise de l'entreprise), Delivered By Supplier,Livré par le Fournisseur, Deferred Revenue,Produits comptabilisés d'avance, Deferred Revenue Account,Compte de produits comptabilisés d'avance, @@ -5134,7 +5134,7 @@ From Folio No,Du No de Folio, To Shareholder,A l'actionnaire, To Folio No,Au N. de Folio, Equity/Liability Account,Compte de capitaux propres / passif, -Asset Account,Compte d'actif, +Asset Account,Compte d'actif, (including),(compris), ACC-SH-.YYYY.-,ACC-SH-.YYYY.-, Folio no.,No. de Folio, @@ -5143,7 +5143,7 @@ Hidden list maintaining the list of contacts linked to Shareholder,Liste cachée Specify conditions to calculate shipping amount,Spécifier les conditions pour calculer le montant de la livraison, Shipping Rule Label,Étiquette de la Règle de Livraison, example: Next Day Shipping,Exemple : Livraison le Jour Suivant, -Shipping Rule Type,Type de règle d'expédition, +Shipping Rule Type,Type de règle d'expédition, Shipping Account,Compte de Livraison, Calculate Based On,Calculer en fonction de, Fixed,Fixé, @@ -5157,11 +5157,11 @@ A condition for a Shipping Rule,Une condition pour une Règle de Livraison, From Value,De la Valeur, To Value,Valeur Finale, Shipping Rule Country,Pays de la Règle de Livraison, -Subscription Period,Période d'abonnement, -Subscription Start Date,Date de début de l'abonnement, -Cancelation Date,Date d'annulation, -Trial Period Start Date,Date de début de la période d'essai, -Trial Period End Date,Date de fin de la période d'évaluation, +Subscription Period,Période d'abonnement, +Subscription Start Date,Date de début de l'abonnement, +Cancelation Date,Date d'annulation, +Trial Period Start Date,Date de début de la période d'essai, +Trial Period End Date,Date de fin de la période d'évaluation, Current Invoice Start Date,Date de début de la facture en cours, Current Invoice End Date,Date de fin de la facture en cours, Days Until Due,Jours avant échéance, @@ -5172,17 +5172,17 @@ Plans,Plans, Discounts,Réductions, Additional DIscount Percentage,Pourcentage de réduction supplémentaire, Additional DIscount Amount,Montant de la Remise Supplémentaire, -Subscription Invoice,Facture d'abonnement, -Subscription Plan,Plan d'abonnement, +Subscription Invoice,Facture d'abonnement, +Subscription Plan,Plan d'abonnement, Price Determination,Détermination du prix, Fixed rate,Taux fixe, Based on price list,Sur la base de la liste de prix, Cost,Coût, Billing Interval,Intervalle de facturation, -Billing Interval Count,Nombre d'intervalles de facturation, -"Number of intervals for the interval field e.g if Interval is 'Days' and Billing Interval Count is 3, invoices will be generated every 3 days","Nombre d'intervalles pour le champ d'intervalle, par exemple si Intervalle est "Jours" et si le décompte d'intervalle de facturation est 3, les factures seront générées tous les 3 jours", +Billing Interval Count,Nombre d'intervalles de facturation, +"Number of intervals for the interval field e.g if Interval is 'Days' and Billing Interval Count is 3, invoices will be generated every 3 days","Nombre d'intervalles pour le champ d'intervalle, par exemple si Intervalle est "Jours" et si le décompte d'intervalle de facturation est 3, les factures seront générées tous les 3 jours", Payment Plan,Plan de paiement, -Subscription Plan Detail,Détail du plan d'abonnement, +Subscription Plan Detail,Détail du plan d'abonnement, Plan,Plan, Subscription Settings,Paramètres des Abonnements, Grace Period,Période de grâce, @@ -5200,25 +5200,25 @@ Billing Country,Pays de Facturation, Shipping City,Ville de Livraison, Shipping County,Comté de Livraison, Shipping State,État de livraison, -Shipping Zipcode,Code postal d'expédition, +Shipping Zipcode,Code postal d'expédition, Shipping Country,Pays de Livraison, Tax Withholding Account,Compte de taxation à la source, -Tax Withholding Rates,Taux de retenue d'impôt, +Tax Withholding Rates,Taux de retenue d'impôt, Rates,Prix, -Tax Withholding Rate,Taux de retenue d'impôt, +Tax Withholding Rate,Taux de retenue d'impôt, Single Transaction Threshold,Seuil de transaction unique, Cumulative Transaction Threshold,Seuil de transaction cumulatif, -Agriculture Analysis Criteria,Critères d'analyse de l'agriculture, +Agriculture Analysis Criteria,Critères d'analyse de l'agriculture, Linked Doctype,Doctype lié, -Water Analysis,Analyse de l'eau, +Water Analysis,Analyse de l'eau, Soil Analysis,Analyse du sol, Plant Analysis,Analyse des plantes, Fertilizer,Engrais, Soil Texture,Texture du sol, Weather,Météo, -Agriculture Manager,Directeur de l'agriculture, +Agriculture Manager,Directeur de l'agriculture, Agriculture User,Agriculteur, -Agriculture Task,Tâche d'agriculture, +Agriculture Task,Tâche d'agriculture, Start Day,Date de début, End Day,Jour de fin, Holiday Management,Gestion des vacances, @@ -5231,9 +5231,9 @@ Crop Name,Nom de la culture, Scientific Name,Nom scientifique, "You can define all the tasks which need to carried out for this crop here. The day field is used to mention the day on which the task needs to be carried out, 1 being the 1st day, etc.. ","Vous pouvez définir ici toutes les tâches à effectuer pour cette culture. Le champ de jour est utilisé pour mentionner le jour où la tâche doit être effectuée, 1 étant le 1er jour, etc.", Crop Spacing,Espacement des cultures, -Crop Spacing UOM,UOM d'espacement des cultures, +Crop Spacing UOM,UOM d'espacement des cultures, Row Spacing,Écartement des rangs, -Row Spacing UOM,UOM d'espacement des lignes, +Row Spacing UOM,UOM d'espacement des lignes, Perennial,Vivace, Biennial,Biennal, Planting UOM,Unité de mesure de la plantation, @@ -5248,7 +5248,7 @@ A link to all the Locations in which the Crop is growing,Lien vers tous les lieu This will be day 1 of the crop cycle,Ce sera le jour 1 du cycle de la culture, ISO 8601 standard,Norme ISO 8601, Cycle Type,Type de cycle, -Less than a year,Moins d'un an, +Less than a year,Moins d'un an, The minimum length between each plant in the field for optimum growth,La longueur minimale entre chaque plante sur le terrain pour une croissance optimale, The minimum distance between rows of plants for optimum growth,La distance minimale entre les rangées de plantes pour une croissance optimale, Detected Diseases,Maladies détectées, @@ -5260,18 +5260,18 @@ Tasks Created,Tâches créées, Common Name,Nom commun, Treatment Task,Tâche de traitement, Treatment Period,Période de traitement, -Fertilizer Name,Nom de l'engrais, +Fertilizer Name,Nom de l'engrais, Density (if liquid),Densité (si liquide), -Fertilizer Contents,Contenu de l'engrais, -Fertilizer Content,Contenu d'engrais, +Fertilizer Contents,Contenu de l'engrais, +Fertilizer Content,Contenu d'engrais, Linked Plant Analysis,Analyse des plantes liées, Linked Soil Analysis,Analyse de sol liée, Linked Soil Texture,Texture de sol liée, Collection Datetime,Date et heure du prélèvement, Laboratory Testing Datetime,Date et heure du test de laboratoire, Result Datetime,Date et heure du résultat, -Plant Analysis Criterias,Critères d'analyse des plantes, -Plant Analysis Criteria,Critères d'analyse des plantes, +Plant Analysis Criterias,Critères d'analyse des plantes, +Plant Analysis Criteria,Critères d'analyse des plantes, Minimum Permissible Value,Valeur minimale autorisée, Maximum Permissible Value,Valeur maximale autorisée, Ca/K,Ca / K, @@ -5279,31 +5279,31 @@ Ca/Mg,Ca / Mg, Mg/K,Mg / K, (Ca+Mg)/K,(Ca + Mg) / K, Ca/(K+Ca+Mg),Ca / (K + Ca + Mg), -Soil Analysis Criterias,Critères d'analyse des sols, -Soil Analysis Criteria,Critères d'analyse des sols, +Soil Analysis Criterias,Critères d'analyse des sols, +Soil Analysis Criteria,Critères d'analyse des sols, Soil Type,Le type de sol, Loamy Sand,Sable limoneux, Sandy Loam,Limon sableux, Loam,Terreau, Silt Loam,Limon fin, Sandy Clay Loam,Limon argilo-sableux, -Clay Loam,Terreau d'argile, +Clay Loam,Terreau d'argile, Silty Clay Loam,Limon argileux fin, Sandy Clay,Argile sableuse, Silty Clay,Argile limoneuse, -Clay Composition (%),Composition d'argile (%), +Clay Composition (%),Composition d'argile (%), Sand Composition (%),Composition de sable (%), Silt Composition (%),Composition de limon (%), Ternary Plot,Tracé ternaire, Soil Texture Criteria,Critères de texture du sol, -Type of Sample,Type d'échantillon, +Type of Sample,Type d'échantillon, Container,Récipient, Origin,Origine, Collection Temperature ,Température de collecte, Storage Temperature,Température de stockage, Appearance,Apparence, Person Responsible,Personne responsable, -Water Analysis Criteria,Critères d'analyse de l'eau, +Water Analysis Criteria,Critères d'analyse de l'eau, Weather Parameter,Paramètre météo, ACC-ASS-.YYYY.-,ACC-ASS-YYYY.-, Asset Owner,Propriétaire de l'Actif, @@ -5313,7 +5313,7 @@ Disposal Date,Date d’Élimination, Journal Entry for Scrap,Écriture de Journal pour la Mise au Rebut, Available-for-use Date,Date de mise en service, Calculate Depreciation,Calculer la dépréciation, -Allow Monthly Depreciation,Autoriser l'amortissement mensuel, +Allow Monthly Depreciation,Autoriser l'amortissement mensuel, Number of Depreciations Booked,Nombre d’Amortissements Comptabilisés, Finance Books,Livres comptables, Straight Line,Linéaire, @@ -5328,17 +5328,17 @@ Depreciation Schedules,Calendriers d'Amortissement, Policy number,Numéro de politique, Insurer,Assureur, Insured value,Valeur assurée, -Insurance Start Date,Date de début de l'assurance, -Insurance End Date,Date de fin de l'assurance, +Insurance Start Date,Date de début de l'assurance, +Insurance End Date,Date de fin de l'assurance, Comprehensive Insurance,Assurance complète, Maintenance Required,Maintenance requise, -Check if Asset requires Preventive Maintenance or Calibration,Vérifier si l'actif nécessite une maintenance préventive ou un étalonnage, +Check if Asset requires Preventive Maintenance or Calibration,Vérifier si l'actif nécessite une maintenance préventive ou un étalonnage, Booked Fixed Asset,Actif immobilisé comptabilisé, -Purchase Receipt Amount,Montant du reçu d'achat, +Purchase Receipt Amount,Montant du reçu d'achat, Default Finance Book,Livre comptable par défaut, Quality Manager,Responsable Qualité, Asset Category Name,Nom de Catégorie d'Actif, -Depreciation Options,Options d'amortissement, +Depreciation Options,Options d'amortissement, Enable Capital Work in Progress Accounting,Activer la comptabilité des immobilisations en cours, Finance Book Detail,Détails du livre comptable, Asset Category Account,Compte de Catégorie d'Actif, @@ -5348,9 +5348,9 @@ Depreciation Expense Account,Compte de Dotations aux Amortissement, Capital Work In Progress Account,Compte d'immobilisation en cours, Asset Finance Book,Livre comptable d'actifs, Written Down Value,Valeur comptable nette, -Depreciation Start Date,Date de début de l'amortissement, +Depreciation Start Date,Date de début de l'amortissement, Expected Value After Useful Life,Valeur Attendue Après Utilisation Complète, -Rate of Depreciation,Taux d'amortissement, +Rate of Depreciation,Taux d'amortissement, In Percentage,En pourcentage, Select Serial No,Veuillez sélectionner le numéro de série, Maintenance Team,Équipe de maintenance, @@ -5369,43 +5369,43 @@ Preventive Maintenance,Maintenance préventive, Calibration,Étalonnage, 2 Yearly,2 ans, Certificate Required,Certificat requis, -Next Due Date,prochaine date d'échéance, -Last Completion Date,Dernière date d'achèvement, +Next Due Date,prochaine date d'échéance, +Last Completion Date,Dernière date d'achèvement, Asset Maintenance Team,Équipe de Maintenance des Actifs, -Maintenance Team Name,Nom de l'équipe de maintenance, -Maintenance Team Members,Membres de l'équipe de maintenance, +Maintenance Team Name,Nom de l'équipe de maintenance, +Maintenance Team Members,Membres de l'équipe de maintenance, Purpose,Objet, Stock Manager,Responsable des Stocks, -Asset Movement Item,Élément de mouvement d'actif, +Asset Movement Item,Élément de mouvement d'actif, Source Location,Localisation source, From Employee,De l'Employé, Target Location,Localisation cible, -To Employee,À l'employé, +To Employee,À l'employé, Asset Repair,Réparation d'Actif, ACC-ASR-.YYYY.-,ACC-ASR-.AAAA.-, -Failure Date,Date d'échec, +Failure Date,Date d'échec, Assign To Name,Attribuer au nom, Repair Status,État de réparation, Error Description,Erreur de description, -Downtime,Temps d'arrêt, +Downtime,Temps d'arrêt, Repair Cost,Coût de réparation, Manufacturing Manager,Responsable de Production, -Current Asset Value,Valeur actuelle de l'actif, -New Asset Value,Nouvelle valeur de l'actif, +Current Asset Value,Valeur actuelle de l'actif, +New Asset Value,Nouvelle valeur de l'actif, Make Depreciation Entry,Créer une Écriture d'Amortissement, Finance Book Id,Identifiant du livre comptable, Location Name,Nom du lieux, Parent Location,Localisation parente, Is Container,Est le contenant, -Check if it is a hydroponic unit,Vérifiez s'il s'agit d'une unité hydroponique, -Location Details,Détails de l'emplacement, +Check if it is a hydroponic unit,Vérifiez s'il s'agit d'une unité hydroponique, +Location Details,Détails de l'emplacement, Latitude,Latitude, Longitude,Longitude, Area,Région, Area UOM,Unité de mesure de la surface, Tree Details,Détails de l’Arbre, -Maintenance Team Member,Membre de l'équipe de maintenance, -Team Member,Membre de l'équipe, +Maintenance Team Member,Membre de l'équipe de maintenance, +Team Member,Membre de l'équipe, Maintenance Role,Rôle de maintenance, Buying Settings,Paramètres d'Achat, Settings for Buying Module,Paramètres du Module Achat, @@ -5428,7 +5428,7 @@ Customer Contact Email,Email Contact Client, Set Target Warehouse,Définir le magasin cible, Supply Raw Materials,Fournir les Matières Premières, Purchase Order Pricing Rule,Règle de tarification des bons de commande, -Set Reserve Warehouse,Définir l'entrepôt de réserve, +Set Reserve Warehouse,Définir l'entrepôt de réserve, In Words will be visible once you save the Purchase Order.,En Toutes Lettres. Sera visible une fois que vous enregistrerez le Bon de Commande., Advance Paid,Avance Payée, % Billed,% Facturé, @@ -5535,23 +5535,23 @@ Parameter Name,Nom du Paramètre, Supplier Scorecard Standing,Classement de la Fiche d'Évaluation Fournisseur, Notify Other,Notifier Autre, Supplier Scorecard Variable,Variable de la Fiche d'Évaluation Fournisseur, -Call Log,Journal d'appel, +Call Log,Journal d'appel, Received By,Reçu par, -Caller Information,Informations sur l'appelant, +Caller Information,Informations sur l'appelant, Contact Name,Nom du Contact, Lead Name,Nom du Prospect, Ringing,Sonnerie, Missed,Manqué, -Call Duration in seconds,Durée d'appel en secondes, -Recording URL,URL d'enregistrement, +Call Duration in seconds,Durée d'appel en secondes, +Recording URL,URL d'enregistrement, Communication Medium,Moyen de Communication, Communication Medium Type,Type de support de communication, Voice,Voix, Catch All,Attraper tout, -"If there is no assigned timeslot, then communication will be handled by this group","S'il n'y a pas d'intervalle de temps attribué, la communication sera gérée par ce groupe.", +"If there is no assigned timeslot, then communication will be handled by this group","S'il n'y a pas d'intervalle de temps attribué, la communication sera gérée par ce groupe.", Timeslots,Tranches de temps, Communication Medium Timeslot,Période de communication moyenne, -Employee Group,Groupe d'employés, +Employee Group,Groupe d'employés, Appointment,Rendez-Vous, Scheduled Time,Heure prévue, Unverified,Non vérifié, @@ -5563,18 +5563,18 @@ Appointment With,Rendez-vous avec, Calendar Event,Événement de calendrier, Appointment Booking Settings,Paramètres de réservation de rendez-vous, Enable Appointment Scheduling,Activer la planification des rendez-vous, -Agent Details,Détails de l'agent, +Agent Details,Détails de l'agent, Availability Of Slots,Disponibilité des emplacements, Number of Concurrent Appointments,Nombre de rendez-vous simultanés, Agents,Agents, Appointment Details,Détails du rendez-vous, Appointment Duration (In Minutes),Durée du rendez-vous (en minutes), Notify Via Email,Avertir par e-mail, -Notify customer and agent via email on the day of the appointment.,Avertissez le client et l'agent par e-mail le jour du rendez-vous., -Number of days appointments can be booked in advance,Nombre de jours de rendez-vous peuvent être réservés à l'avance, +Notify customer and agent via email on the day of the appointment.,Avertissez le client et l'agent par e-mail le jour du rendez-vous., +Number of days appointments can be booked in advance,Nombre de jours de rendez-vous peuvent être réservés à l'avance, Success Settings,Paramètres de réussite, Success Redirect URL,URL de redirection réussie, -"Leave blank for home.\nThis is relative to site URL, for example ""about"" will redirect to ""https://yoursitename.com/about""","Laissez vide pour la maison. Ceci est relatif à l'URL du site, par exemple "about" redirigera vers "https://yoursitename.com/about"", +"Leave blank for home.\nThis is relative to site URL, for example ""about"" will redirect to ""https://yoursitename.com/about""","Laissez vide pour la maison. Ceci est relatif à l'URL du site, par exemple "about" redirigera vers "https://yoursitename.com/about"", Appointment Booking Slots,Horaires de prise de rendez-vous, From Time ,Horaire de Début, Campaign Email Schedule,Calendrier des e-mails de campagne, @@ -5595,17 +5595,17 @@ Signed On,Signé le, Contract Details,Détails du contrat, Contract Template,Modèle de contrat, Contract Terms,Termes du contrat, -Fulfilment Details,Détails de l'exécution, +Fulfilment Details,Détails de l'exécution, Requires Fulfilment,Nécessite des conditions, -Fulfilment Deadline,Délai d'exécution, -Fulfilment Terms,Conditions d'exécution, -Contract Fulfilment Checklist,Liste de vérification de l'exécution des contrats, +Fulfilment Deadline,Délai d'exécution, +Fulfilment Terms,Conditions d'exécution, +Contract Fulfilment Checklist,Liste de vérification de l'exécution des contrats, Requirement,Obligations, Contract Terms and Conditions,Termes et conditions du contrat, -Fulfilment Terms and Conditions,Termes et conditions d'exécution, +Fulfilment Terms and Conditions,Termes et conditions d'exécution, Contract Template Fulfilment Terms,Conditions d'exécution du modèle de contrat, 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, CRM-LEAD-.YYYY.-,CRM-LEAD-.YYYY.-, Person Name,Nom de la Personne, @@ -5668,7 +5668,7 @@ Examiner Name,Nom de l'Examinateur, Supervisor,Superviseur, Supervisor Name,Nom du Superviseur, Evaluate,Évaluer, -Maximum Assessment Score,Score d'évaluation maximale, +Maximum Assessment Score,Score d'évaluation maximale, Assessment Plan Criteria,Critères du Plan d'Évaluation, Maximum Score,Score Maximum, Total Score,Score Total, @@ -5684,10 +5684,10 @@ Course Name,Nom du Cours, Topics,Les sujets, Hero Image,Image de héros, Default Grading Scale,Échelle de Notation par Défault, -Education Manager,Gestionnaire de l'éducation, +Education Manager,Gestionnaire de l'éducation, Course Activity,Activité de cours, Course Enrollment,Inscription au cours, -Activity Date,Date d'activité, +Activity Date,Date d'activité, Course Assessment Criteria,Critères d'Évaluation du Cours, Weightage,Poids, Course Content,Le contenu des cours, @@ -5703,7 +5703,7 @@ Course End Date,Date de Fin du Cours, Course Topic,Sujet du cours, Topic,Sujet, Topic Name,Nom du Sujet, -Education Settings,Paramètres d'éducation, +Education Settings,Paramètres d'éducation, Current Academic Year,Année Académique Actuelle, Current Academic Term,Terme Académique Actuel, Attendance Freeze Date,Date du Gel des Présences, @@ -5712,7 +5712,7 @@ Validate Batch for Students in Student Group,Valider le Lot pour les Étudiants Validate Enrolled Course for Students in Student Group,Valider le Cours Inscrit pour les Étudiants en Groupe Étudiant, "For Course based Student Group, the Course will be validated for every Student from the enrolled Courses in Program Enrollment.","Pour un groupe étudiant basé sur un cours, le cours sera validé pour chaque élève inscrit aux cours du programme.", Make Academic Term Mandatory,Faire un terme académique obligatoire, -"If enabled, field Academic Term will be Mandatory in Program Enrollment Tool.","Si cette option est activée, le champ Période académique sera obligatoire dans l'outil d'inscription au programme.", +"If enabled, field Academic Term will be Mandatory in Program Enrollment Tool.","Si cette option est activée, le champ Période académique sera obligatoire dans l'outil d'inscription au programme.", Instructor Records to be created by,Les Enregistrements de l'Instructeur seront créés par, Employee Number,Numéro d'Employé, LMS Settings,Paramètres LMS, @@ -5760,7 +5760,7 @@ Guardian Interest,Part du Tuteur, Interest,Intérêt, Guardian Student,Tuteur de l'Étudiant, EDU-INS-.YYYY.-,EDU-INS-YYYY.-, -Instructor Log,Journal de l'instructeur, +Instructor Log,Journal de l'instructeur, Other details,Autres Détails, Option,Option, Is Correct,Est correct, @@ -5768,15 +5768,15 @@ Program Name,Nom du Programme, Program Abbreviation,Abréviation du Programme, Courses,Cours, Is Published,Est publié, -Allow Self Enroll,Autoriser l'auto-inscription, +Allow Self Enroll,Autoriser l'auto-inscription, Is Featured,Est en vedette, -Intro Video,Vidéo d'introduction, +Intro Video,Vidéo d'introduction, Program Course,Cours du Programme, School House,Maison de l'École, Boarding Student,Enregistrement Étudiant, Check this if the Student is residing at the Institute's Hostel.,Vérifiez si l'Étudiant réside à la Résidence de l'Institut., Walking,En Marchant, -Institute's Bus,Bus de l'Institut, +Institute's Bus,Bus de l'Institut, Public Transport,Transports Publics, Self-Driving Vehicle,Véhicule Autonome, Pick/Drop by Guardian,Déposé/Récupéré par le Tuteur, @@ -5787,7 +5787,7 @@ Program Enrollment Tool,Outil d’Inscription au Programme, Get Students From,Obtenir les Étudiants De, Student Applicant,Candidature Étudiante, Get Students,Obtenir les Étudiants, -Enrollment Details,Détails d'inscription, +Enrollment Details,Détails d'inscription, New Program,Nouveau Programme, New Student Batch,Nouveau groupe d'étudiants, Enroll Students,Inscrire des Étudiants, @@ -5846,7 +5846,7 @@ Admission Start Date,Date de Début de l'Admission, Admission End Date,Date de Fin de l'Admission, Publish on website,Publier sur le site web, Eligibility and Details,Admissibilité et Détails, -Student Admission Program,Programme d'admission des étudiants, +Student Admission Program,Programme d'admission des étudiants, Minimum Age,Âge Minimum, Maximum Age,Âge Maximum, Application Fee,Frais de Dossier, @@ -5883,14 +5883,14 @@ Will show the student as Present in Student Monthly Attendance Report,Affichera Student Log,Journal des Étudiants, Academic,Académique, Achievement,Réalisation, -Student Report Generation Tool,Outil de génération de rapports d'étudiants, -Include All Assessment Group,Inclure tout le groupe d'évaluation, +Student Report Generation Tool,Outil de génération de rapports d'étudiants, +Include All Assessment Group,Inclure tout le groupe d'évaluation, Show Marks,Afficher les notes, Add letterhead,Ajouter un en-tête, Print Section,Section d'impression, Total Parents Teacher Meeting,Total des réunions parents/professeur, Attended by Parents,Les parents ont participé, -Assessment Terms,Conditions d'évaluation, +Assessment Terms,Conditions d'évaluation, Student Sibling,Frère et Sœur de l'Étudiant, Studying in Same Institute,Étudier au même Institut, Student Siblings,Frères et Sœurs de l'Étudiants, @@ -5898,10 +5898,10 @@ Topic Content,Contenu du sujet, Amazon MWS Settings,Paramètres Amazon MWS, ERPNext Integrations,Intégrations ERPNext, Enable Amazon,Activer Amazon, -MWS Credentials,Informations d'identification MWS, +MWS Credentials,Informations d'identification MWS, Seller ID,ID du vendeur, -AWS Access Key ID,ID de clé d'accès AWS, -MWS Auth Token,Jeton d'authentification MWS, +AWS Access Key ID,ID de clé d'accès AWS, +MWS Auth Token,Jeton d'authentification MWS, Market Place ID,Identifiant de la place du marché, AU,AU, BR,BR, @@ -5919,12 +5919,12 @@ Market Place Account Group,Groupe de comptes de marché, After Date,Après la date, Amazon will synch data updated after this date,Amazon synchronisera les données mises à jour après cette date, Get financial breakup of Taxes and charges data by Amazon ,Obtenez la répartition financière des taxes et des données de facturation par Amazon, -Click this button to pull your Sales Order data from Amazon MWS.,Cliquez sur ce bouton pour extraire vos données de commande client d'Amazon MWS., +Click this button to pull your Sales Order data from Amazon MWS.,Cliquez sur ce bouton pour extraire vos données de commande client d'Amazon MWS., Check this to enable a scheduled Daily synchronization routine via scheduler,Cochez cette case pour activer une routine de synchronisation quotidienne programmée via le planificateur, Max Retry Limit,Max Retry Limit, Exotel Settings,Paramètres Exotel, Account SID,Compte SID, -API Token,Jeton d'API, +API Token,Jeton d'API, GoCardless Mandate,Mandat GoCardless, Mandate,Mandat, GoCardless Customer,Client GoCardless, @@ -5939,15 +5939,15 @@ Plaid Environment,Environnement écossais, sandbox,bac à sable, development,développement, QuickBooks Migrator,QuickBooks Migrator, -Application Settings,Paramètres de l'application, +Application Settings,Paramètres de l'application, Token Endpoint,Point de terminaison de jeton, Scope,Portée, -Authorization Settings,Paramètres d'autorisation, +Authorization Settings,Paramètres d'autorisation, Authorization Endpoint,Autorisation Endpoint, -Authorization URL,URL d'autorisation, +Authorization URL,URL d'autorisation, Quickbooks Company ID,ID Quickbooks de la société, Company Settings,des paramètres de l'entreprise, -Default Shipping Account,Compte d'expédition par défaut, +Default Shipping Account,Compte d'expédition par défaut, Default Warehouse,Entrepôt par Défaut, Default Cost Center,Centre de Coûts par Défaut, Undeposited Funds Account,Compte de fonds non déposés, @@ -5956,7 +5956,7 @@ Request Data,Données de la requête, Shopify Settings,Paramètres de Shopify, status html,Statut, Enable Shopify,Activer Shopify, -App Type,Type d'application, +App Type,Type d'application, Last Sync Datetime,Dernière date de synchronisation, Shop URL,URL de la boutique, eg: frappe.myshopify.com,par exemple: frappe.myshopify.com, @@ -6004,15 +6004,15 @@ Secret,Secret, API consumer key,Clé de consommateur API, API consumer secret,Secret de consommateur API, Tax Account,Compte de taxes, -Freight and Forwarding Account,Compte de fret et d'expédition, +Freight and Forwarding Account,Compte de fret et d'expédition, Creation User,Création utilisateur, "The user that will be used to create Customers, Items and Sales Orders. This user should have the relevant permissions.","Utilisateur qui sera utilisé pour créer des clients, des articles et des commandes clients. Cet utilisateur doit avoir les autorisations appropriées.", -"This warehouse will be used to create Sales Orders. The fallback warehouse is ""Stores"".",Cet entrepôt sera utilisé pour créer des commandes client. L'entrepôt de secours est "Stores"., +"This warehouse will be used to create Sales Orders. The fallback warehouse is ""Stores"".",Cet entrepôt sera utilisé pour créer des commandes client. L'entrepôt de secours est "Stores"., "The fallback series is ""SO-WOO-"".",La série de repli est "SO-WOO-"., This company will be used to create Sales Orders.,Cette société sera utilisée pour créer des commandes client., Delivery After (Days),Livraison après (jours), -This is the default offset (days) for the Delivery Date in Sales Orders. The fallback offset is 7 days from the order placement date.,Il s'agit du décalage par défaut (jours) pour la date de livraison dans les commandes client. La compensation de repli est de 7 jours à compter de la date de passation de la commande., -"This is the default UOM used for items and Sales orders. The fallback UOM is ""Nos"".",Il s'agit de l'UOM par défaut utilisée pour les articles et les commandes clients. La MOU de repli est "Nos"., +This is the default offset (days) for the Delivery Date in Sales Orders. The fallback offset is 7 days from the order placement date.,Il s'agit du décalage par défaut (jours) pour la date de livraison dans les commandes client. La compensation de repli est de 7 jours à compter de la date de passation de la commande., +"This is the default UOM used for items and Sales orders. The fallback UOM is ""Nos"".",Il s'agit de l'UOM par défaut utilisée pour les articles et les commandes clients. La MOU de repli est "Nos"., Endpoints,Points de terminaison, Endpoint,Point de terminaison, Antibiotic Name,Nom de l'Antibiotique, @@ -6056,14 +6056,14 @@ Charges,Charges, Default Currency,Devise par Défaut, Healthcare Schedule Time Slot,Horaire horaire, Parent Service Unit,Service parent, -Service Unit Type,Type d'unité de service, +Service Unit Type,Type d'unité de service, Allow Appointments,Autoriser les rendez-vous, Allow Overlap,Autoriser le chevauchement, Inpatient Occupancy,Occupation des patients hospitalisés, -Occupancy Status,Statut d'occupation, +Occupancy Status,Statut d'occupation, Vacant,Vacant, Occupied,Occupé, -Item Details,Détails d'article, +Item Details,Détails d'article, UOM Conversion in Hours,Conversion UOM en heures, Rate / UOM,Taux / UM, Change in Item,Modification dans l'Article, @@ -6089,7 +6089,7 @@ Reminder Message,Message de Rappel, Remind Before,Rappeler Avant, Laboratory Settings,Paramètres de laboratoire, Employee name and designation in print,Nom et désignation de l'employé sur l'imprimé, -Custom Signature in Print,Signature personnalisée dans l'impression, +Custom Signature in Print,Signature personnalisée dans l'impression, Laboratory SMS Alerts,Alertes SMS de laboratoire, Check In,Arrivée, Check Out,Départ, @@ -6146,7 +6146,7 @@ Require Result Value,Nécessite la Valeur du Résultat, Normal Test Template,Modèle de Test Normal, Patient Demographics,Démographie du Patient, HLC-PAT-.YYYY.-,HLC-PAT-. AAAA.-, -Inpatient Status,Statut d'hospitalisation, +Inpatient Status,Statut d'hospitalisation, Personal and Social History,Antécédents Personnels et Sociaux, Marital Status,État Civil, Married,Marié, @@ -6164,7 +6164,7 @@ Other Risk Factors,Autres facteurs de risque, Patient Details,Détails du patient, Additional information regarding the patient,Informations complémentaires concernant le patient, Patient Age,Âge du patient, -More Info,Plus d'infos, +More Info,Plus d'infos, Referring Practitioner,Praticien référant, Reminded,Rappelé, Parameters,Paramètres, @@ -6181,7 +6181,7 @@ Spouse,Époux, Family,Famille, Schedule Name,Nom du calendrier, Time Slots,Créneaux Horaires, -Practitioner Service Unit Schedule,Horaire de l'unité de service du praticien, +Practitioner Service Unit Schedule,Horaire de l'unité de service du praticien, Procedure Name,Nom de la procédure, Appointment Booked,Rendez-vous pris, Procedure Created,Procédure créée, @@ -6217,25 +6217,25 @@ One Sided,Une face, Blood Pressure (systolic),Pression Artérielle (Systolique), Blood Pressure (diastolic),Pression Artérielle (Diastolique), Blood Pressure,Pression Artérielle, -"Normal resting blood pressure in an adult is approximately 120 mmHg systolic, and 80 mmHg diastolic, abbreviated ""120/80 mmHg""","La tension artérielle normale chez un adulte est d'environ 120 mmHg systolique et 80 mmHg diastolique, abrégé "120/80 mmHg"", +"Normal resting blood pressure in an adult is approximately 120 mmHg systolic, and 80 mmHg diastolic, abbreviated ""120/80 mmHg""","La tension artérielle normale chez un adulte est d'environ 120 mmHg systolique et 80 mmHg diastolique, abrégé "120/80 mmHg"", Nutrition Values,Valeurs Nutritionnelles, Height (In Meter),Hauteur (en Mètres), Weight (In Kilogram),Poids (En Kilogramme), BMI,IMC, -Hotel Room,Chambre d'hôtel, -Hotel Room Type,Type de chambre d'hôtel, +Hotel Room,Chambre d'hôtel, +Hotel Room Type,Type de chambre d'hôtel, Capacity,Capacité, Extra Bed Capacity,Capacité de lits supplémentaire, -Hotel Manager,Directeur de l'hôtel, +Hotel Manager,Directeur de l'hôtel, Hotel Room Amenity,Équipement de la chambre d'hôtel, Billable,Facturable, Hotel Room Package,Forfait de la chambre d'hôtel, Amenities,Équipements, -Hotel Room Pricing,Prix de la chambre d'hôtel, +Hotel Room Pricing,Prix de la chambre d'hôtel, Hotel Room Pricing Item,Article de prix de la chambre d'hôtel, Hotel Room Pricing Package,Forfait de prix de la chambre d'hôtel, Hotel Room Reservation,Réservation de la chambre d'hôtel, -Guest Name,Nom de l'invité, +Guest Name,Nom de l'invité, Late Checkin,Arrivée tardive, Booked,Réservé, Hotel Reservation User,Utilisateur chargé des réservations d'hôtel, @@ -6264,7 +6264,7 @@ Closing Notes,Notes de clôture, Appointment Letter content,Contenu de la lettre de nomination, Appraisal,Estimation, HR-APR-.YY.-.MM.,HR-APR-.YY.-.MM., -Appraisal Template,Modèle d'évaluation, +Appraisal Template,Modèle d'évaluation, For Employee Name,Nom de l'Employé, Goals,Objectifs, Calculate Total Score,Calculer le Résultat Total, @@ -6322,7 +6322,7 @@ Applicable for external driver,Applicable pour pilote externe, Cellphone Number,Numéro de téléphone portable, License Details,Détails de la licence, License Number,Numéro de licence, -Issuing Date,Date d'émission, +Issuing Date,Date d'émission, Driving License Categories,Catégories de permis de conduire, Driving License Category,Catégorie de permis de conduire, Fleet Manager,Gestionnaire de Flotte, @@ -6330,7 +6330,7 @@ Driver licence class,Classe de permis de conduire, HR-EMP-,HR-EMP-, Employment Type,Type d'Emploi, Emergency Contact,Contact en cas d'Urgence, -Emergency Contact Name,Nom à contacter en cas d'urgence, +Emergency Contact Name,Nom à contacter en cas d'urgence, Emergency Phone,Téléphone d'Urgence, ERPNext User,Utilisateur ERPNext, "System User (login) ID. If set, it will become default for all HR forms.","L'ID (de connexion) de l'Utilisateur Système. S'il est défini, il deviendra la valeur par défaut pour tous les formulaires des RH.", @@ -6346,7 +6346,7 @@ Department and Grade,Département et échelon, Reports to,Rapports À, Attendance and Leave Details,Détails de présence et de congés, Leave Policy,Politique de congé, -Attendance Device ID (Biometric/RF tag ID),Périphérique d'assistance (identifiant d'étiquette biométrique / RF), +Attendance Device ID (Biometric/RF tag ID),Périphérique d'assistance (identifiant d'étiquette biométrique / RF), Applicable Holiday List,Liste de Vacances Valable, Default Shift,Décalage par défaut, Salary Details,Détails du salaire, @@ -6397,7 +6397,7 @@ HR-EAD-.YYYY.-,HR-EAD-.YYYY.-, Due Advance Amount,Montant de l'avance dû, Returned Amount,Montant retourné, Claimed,Réclamé, -Advance Account,Compte d'avances, +Advance Account,Compte d'avances, Employee Attendance Tool,Outil de Gestion des Présences des Employés, Unmarked Attendance,Participation Non Marquée, Employees HTML,Employés HTML, @@ -6409,7 +6409,7 @@ Remaining Benefits (Yearly),Prestations sociales restantes (par année), Payroll Period,Période de paie, Benefits Applied,Prestations demandées, Dispensed Amount (Pro-rated),Montant distribué (au prorata), -Employee Benefit Application Detail,Détail de la demande d'avantages sociaux, +Employee Benefit Application Detail,Détail de la demande d'avantages sociaux, Earning Component,Composante de revenu, Pay Against Benefit Claim,Payer la demande de prestations, Max Benefit Amount,Montant maximal des prestations, @@ -6420,15 +6420,15 @@ Claim Benefit For,Demande de prestations pour, Max Amount Eligible,Montant maximum admissible, Expense Proof,Preuves de dépenses, Employee Boarding Activity,Activité d'intégration des nouveaux employés, -Activity Name,Nom de l'activité, +Activity Name,Nom de l'activité, Task Weight,Poids de la Tâche, -Required for Employee Creation,Obligatoire pour la création d'un employé, +Required for Employee Creation,Obligatoire pour la création d'un employé, Applicable in the case of Employee Onboarding,Applicable dans le cas de l'accueil des nouveaux employés, Employee Checkin,Enregistrement des employés, Log Type,Type de journal, OUT,EN DEHORS, Location / Device ID,Emplacement / ID de périphérique, -Skip Auto Attendance,Ignorer l'assistance automatique, +Skip Auto Attendance,Ignorer l'assistance automatique, Shift Start,Début de quart, Shift End,Fin de quart, Shift Actual Start,Décalage début effectif, @@ -6445,7 +6445,7 @@ Employee External Work History,Antécédents Professionnels de l'Employé, Total Experience,Expérience Totale, Default Leave Policy,Politique de congés par défaut, Default Salary Structure,Structure salariale par défaut, -Employee Group Table,Table de groupe d'employés, +Employee Group Table,Table de groupe d'employés, ERPNext User ID,ID utilisateur ERPNext, Employee Health Insurance,Assurance maladie des employés, Health Insurance Name,Nom de l'assurance santé, @@ -6465,34 +6465,34 @@ Employee Property History,Historique des propriétés des champs de la fiche emp Employee Separation,Départ des employés, Employee Separation Template,Modèle de départ des employés, Exit Interview Summary,Récapitulatif de l'entretien de sortie, -Employee Skill,Compétence de l'employé, +Employee Skill,Compétence de l'employé, Proficiency,Compétence, -Evaluation Date,Date d'évaluation, +Evaluation Date,Date d'évaluation, Employee Skill Map,Carte de compétences des employés, Employee Skills,Compétences des employés, Trainings,Des formations, Employee Tax Exemption Category,Catégorie d'exemption de taxe des employés, -Max Exemption Amount,Montant maximum d'exemption, +Max Exemption Amount,Montant maximum d'exemption, Employee Tax Exemption Declaration,Déclaration d'exemption de taxe, Declarations,Déclarations, Total Declared Amount,Montant total déclaré, Total Exemption Amount,Montant total de l'exonération, Employee Tax Exemption Declaration Category,Catégorie de déclaration d'exemption de taxe, -Exemption Sub Category,Sous-catégorie d'exemption, -Exemption Category,Catégorie d'exemption, +Exemption Sub Category,Sous-catégorie d'exemption, +Exemption Category,Catégorie d'exemption, Maximum Exempted Amount,Montant maximum exonéré, Declared Amount,Montant Déclaré, Employee Tax Exemption Proof Submission,Soumission d'une preuve d'exemption de taxe, Submission Date,Date de soumission, -Tax Exemption Proofs,Preuves d'exonération fiscale, +Tax Exemption Proofs,Preuves d'exonération fiscale, Total Actual Amount,Montant total total, Employee Tax Exemption Proof Submission Detail,Détails de la soumission de preuve d'exemption de taxe, -Maximum Exemption Amount,Montant maximum d'exemption, +Maximum Exemption Amount,Montant maximum d'exemption, Type of Proof,Type de preuve, Actual Amount,Montant actuel, Employee Tax Exemption Sub Category,Sous-catégorie d'exemption de taxe, Tax Exemption Category,Catégorie d'exonération fiscale, -Employee Training,Entrainement d'employé, +Employee Training,Entrainement d'employé, Training Date,Date de formation, Employee Transfer,Transfert des employés, Transfer Date,Date de transfert, @@ -6505,7 +6505,7 @@ Employee Transfer Property,Propriété des champs pour le transfert des employé HR-EXP-.YYYY.-,HR-EXP-. AAAA.-, Expense Taxes and Charges,Frais et taxes, Total Sanctioned Amount,Montant Total Validé, -Total Advance Amount,Montant total de l'avance, +Total Advance Amount,Montant total de l'avance, Total Claimed Amount,Montant Total Réclamé, Total Amount Reimbursed,Montant Total Remboursé, Vehicle Log,Journal du Véhicule, @@ -6540,7 +6540,7 @@ Include holidays in Total no. of Working Days,Inclure les vacances dans le nombr Email Salary Slip to Employee,Envoyer la Fiche de Paie à l'Employé par Mail, Emails salary slip to employee based on preferred email selected in Employee,Envoi des fiches de paie à l'employé par Email en fonction de l'email sélectionné dans la fiche Employé, Encrypt Salary Slips in Emails,Crypter les bulletins de salaire dans les courriels, -"The salary slip emailed to the employee will be password protected, the password will be generated based on the password policy.",La fiche de salaire envoyée à l'employé par courrier électronique sera protégée par un mot de passe. Le mot de passe sera généré en fonction de la politique de mot de passe., +"The salary slip emailed to the employee will be password protected, the password will be generated based on the password policy.",La fiche de salaire envoyée à l'employé par courrier électronique sera protégée par un mot de passe. Le mot de passe sera généré en fonction de la politique de mot de passe., Password Policy,Politique de mot de passe, Example: SAL-{first_name}-{date_of_birth.year}
This will generate a password like SAL-Jane-1972,Exemple: SAL- {prenom} - {date_naissance.année}
Cela générera un mot de passe comme SAL-Jane-1972, Leave Settings,Paramètres des Congés, @@ -6551,10 +6551,10 @@ Leave Approver Mandatory In Leave Application,Approbateur de congés obligatoire Show Leaves Of All Department Members In Calendar,Afficher les congés de tous les membres du département dans le calendrier, Auto Leave Encashment,Auto Leave Encashment, Restrict Backdated Leave Application,Restreindre la demande de congé antidaté, -Hiring Settings,Paramètres d'embauche, -Check Vacancies On Job Offer Creation,Vérifier les offres d'emploi lors de la création d'une offre d'emploi, -Identification Document Type,Type de document d'identification, -Standard Tax Exemption Amount,Montant de l'exemption fiscale standard, +Hiring Settings,Paramètres d'embauche, +Check Vacancies On Job Offer Creation,Vérifier les offres d'emploi lors de la création d'une offre d'emploi, +Identification Document Type,Type de document d'identification, +Standard Tax Exemption Amount,Montant de l'exemption fiscale standard, Taxable Salary Slabs,Paliers de salaire imposables, Applicant for a Job,Candidat à un Emploi, Accepted,Accepté, @@ -6606,11 +6606,11 @@ Leave Block List Date,Date de la Liste de Blocage des Congés, Block Date,Bloquer la Date, Leave Control Panel,Quitter le Panneau de Configuration, Select Employees,Sélectionner les Employés, -Employment Type (optional),Type d'emploi (facultatif), +Employment Type (optional),Type d'emploi (facultatif), Branch (optional),Branche (optionnel), Department (optional),Département (optionnel), Designation (optional),Désignation (facultatif), -Employee Grade (optional),Grade d'employé (facultatif), +Employee Grade (optional),Grade d'employé (facultatif), Employee (optional),Employé (facultatif), Allocate Leaves,Allouer des feuilles, Carry Forward,Reporter, @@ -6642,8 +6642,8 @@ Maximum Carry Forwarded Leaves,Nombre maximal de congés reportés, Expire Carry Forwarded Leaves (Days),Expirer les congés reportés (jours), Calculated in days,Calculé en jours, Encashment,Encaissement, -Allow Encashment,Autoriser l'encaissement, -Encashment Threshold Days,Jours de seuil d'encaissement, +Allow Encashment,Autoriser l'encaissement, +Encashment Threshold Days,Jours de seuil d'encaissement, Earned Leave,Congés acquis, Is Earned Leave,Est un congé acquis, Earned Leave Frequency,Fréquence d'acquisition des congés, @@ -6653,7 +6653,7 @@ Payroll Frequency,Fréquence de la Paie, Fortnightly,Bimensuel, Bimonthly,Bimensuel, Employees,Employés, -Number Of Employees,Nombre d'employés, +Number Of Employees,Nombre d'employés, Employee Details,Détails des employés, Validate Attendance,Valider la présence, Salary Slip Based on Timesheet,Fiche de Paie basée sur la Feuille de Temps, @@ -6673,9 +6673,9 @@ Abbr,Abré, Depends on Payment Days,Dépend des jours de paiement, Is Tax Applicable,Est taxable, Variable Based On Taxable Salary,Variable basée sur le salaire imposable, -Round to the Nearest Integer,Arrondir à l'entier le plus proche, +Round to the Nearest Integer,Arrondir à l'entier le plus proche, Statistical Component,Composante Statistique, -"If selected, the value specified or calculated in this component will not contribute to the earnings or deductions. However, it's value can be referenced by other components that can be added or deducted. ","Si cette option est sélectionnée, la valeur spécifiée ou calculée dans ce composant ne contribuera pas aux gains ou aux déductions. Cependant, sa valeur peut être référencée par d'autres composants qui peuvent être ajoutés ou déduits.", +"If selected, the value specified or calculated in this component will not contribute to the earnings or deductions. However, it's value can be referenced by other components that can be added or deducted. ","Si cette option est sélectionnée, la valeur spécifiée ou calculée dans ce composant ne contribuera pas aux gains ou aux déductions. Cependant, sa valeur peut être référencée par d'autres composants qui peuvent être ajoutés ou déduits.", Flexible Benefits,Avantages sociaux variables, Is Flexible Benefit,Est un avantage flexible, Max Benefit Amount (Yearly),Montant maximum des prestations sociales (annuel), @@ -6703,7 +6703,7 @@ Earnings,Bénéfices, Deductions,Déductions, Employee Loan,Prêt Employé, Total Principal Amount,Montant total du capital, -Total Interest Amount,Montant total de l'intérêt, +Total Interest Amount,Montant total de l'intérêt, Total Loan Repayment,Total de Remboursement du Prêt, net pay info,Info de salaire net, Gross Pay - Total Deduction - Loan Repayment,Salaire Brut - Déductions Totales - Remboursement de Prêt, @@ -6719,17 +6719,17 @@ Shift Assignment,Affectation de quart, Shift Type,Type de quart, Shift Request,Demande de quart, Enable Auto Attendance,Activer la présence automatique, -Mark attendance based on 'Employee Checkin' for Employees assigned to this shift.,Marquez la présence sur la base de 'Enregistrement des employés' pour les employés affectés à ce poste., +Mark attendance based on 'Employee Checkin' for Employees assigned to this shift.,Marquez la présence sur la base de 'Enregistrement des employés' pour les employés affectés à ce poste., Auto Attendance Settings,Paramètres de présence automatique, Determine Check-in and Check-out,Déterminer les entrées et les sorties, Alternating entries as IN and OUT during the same shift,Alterner les entrées comme IN et OUT pendant le même quart, -Strictly based on Log Type in Employee Checkin,Strictement basé sur le type de journal dans l'enregistrement des employés, +Strictly based on Log Type in Employee Checkin,Strictement basé sur le type de journal dans l'enregistrement des employés, Working Hours Calculation Based On,Calcul des heures de travail basé sur, First Check-in and Last Check-out,Premier enregistrement et dernier départ, Every Valid Check-in and Check-out,Chaque enregistrement valide et check-out, -Begin check-in before shift start time (in minutes),Commencez l'enregistrement avant l'heure de début du poste (en minutes), -The time before the shift start time during which Employee Check-in is considered for attendance.,Heure avant l'heure de début du quart pendant laquelle l'enregistrement des employés est pris en compte pour la présence., -Allow check-out after shift end time (in minutes),Autoriser le départ après l'heure de fin du quart (en minutes), +Begin check-in before shift start time (in minutes),Commencez l'enregistrement avant l'heure de début du poste (en minutes), +The time before the shift start time during which Employee Check-in is considered for attendance.,Heure avant l'heure de début du quart pendant laquelle l'enregistrement des employés est pris en compte pour la présence., +Allow check-out after shift end time (in minutes),Autoriser le départ après l'heure de fin du quart (en minutes), Time after the end of shift during which check-out is considered for attendance.,Heure après la fin du quart de travail au cours de laquelle la prise en charge est prise en compte., Working Hours Threshold for Half Day,Seuil des heures de travail pour une demi-journée, Working hours below which Half Day is marked. (Zero to disable),Heures de travail en dessous desquelles la demi-journée est marquée. (Zéro à désactiver), @@ -6738,14 +6738,14 @@ Working hours below which Absent is marked. (Zero to disable),Heures de travail Process Attendance After,Processus de présence après, Attendance will be marked automatically only after this date.,La participation sera automatiquement marquée après cette date., Last Sync of Checkin,Dernière synchronisation de Checkin, -Last Known Successful Sync of Employee Checkin. Reset this only if you are sure that all Logs are synced from all the locations. Please don't modify this if you are unsure.,Dernière synchronisation réussie de l'enregistrement des employés. Réinitialisez cette opération uniquement si vous êtes certain que tous les journaux sont synchronisés à partir de tous les emplacements. S'il vous plaît ne modifiez pas cela si vous n'êtes pas sûr., -Grace Period Settings For Auto Attendance,Paramètres de période de grâce pour l'assistance automatique, -Enable Entry Grace Period,Activer la période de grâce d'entrée, +Last Known Successful Sync of Employee Checkin. Reset this only if you are sure that all Logs are synced from all the locations. Please don't modify this if you are unsure.,Dernière synchronisation réussie de l'enregistrement des employés. Réinitialisez cette opération uniquement si vous êtes certain que tous les journaux sont synchronisés à partir de tous les emplacements. S'il vous plaît ne modifiez pas cela si vous n'êtes pas sûr., +Grace Period Settings For Auto Attendance,Paramètres de période de grâce pour l'assistance automatique, +Enable Entry Grace Period,Activer la période de grâce d'entrée, Late Entry Grace Period,Délai de grâce pour entrée tardive, -The time after the shift start time when check-in is considered as late (in minutes).,L'heure après l'heure de début du quart de travail où l'enregistrement est considéré comme tardif (en minutes)., +The time after the shift start time when check-in is considered as late (in minutes).,L'heure après l'heure de début du quart de travail où l'enregistrement est considéré comme tardif (en minutes)., Enable Exit Grace Period,Activer la période de grâce de sortie, Early Exit Grace Period,Période de grâce de sortie anticipée, -The time before the shift end time when check-out is considered as early (in minutes).,L'heure avant l'heure de fin du quart de travail au moment du départ est considérée comme précoce (en minutes)., +The time before the shift end time when check-out is considered as early (in minutes).,L'heure avant l'heure de fin du quart de travail au moment du départ est considérée comme précoce (en minutes)., Skill Name,Nom de la compétence, Staffing Plan Details,Détails du plan de dotation, Staffing Plan Detail,Détail du plan de dotation, @@ -6797,8 +6797,8 @@ Travel Advance Required,Avance de déplacement requise, Departure Datetime,Date/Heure de départ, Arrival Datetime,Date/Heure d'arrivée, Lodging Required,Hébergement requis, -Preferred Area for Lodging,Zone préférée pour l'hébergement, -Check-in Date,Date d'arrivée, +Preferred Area for Lodging,Zone préférée pour l'hébergement, +Check-in Date,Date d'arrivée, Check-out Date,Date de départ, Travel Request,Demande de déplacement, Travel Type,Type de déplacement, @@ -6808,15 +6808,15 @@ Travel Funding,Financement du déplacement, Require Full Funding,Nécessite un financement complet, Fully Sponsored,Entièrement commandité, "Partially Sponsored, Require Partial Funding","Partiellement sponsorisé, nécessite un financement partiel", -Copy of Invitation/Announcement,Copie de l'invitation / annonce, +Copy of Invitation/Announcement,Copie de l'invitation / annonce, "Details of Sponsor (Name, Location)","Détails du commanditaire (nom, lieu)", Identification Document Number,Numéro du document d'identification, Any other details,Tout autre détail, Costing Details,Détails des coûts, Costing,Coût, -Event Details,Détails de l'évènement, -Name of Organizer,Nom de l'organisateur, -Address of Organizer,Adresse de l'organisateur, +Event Details,Détails de l'évènement, +Name of Organizer,Nom de l'organisateur, +Address of Organizer,Adresse de l'organisateur, Travel Request Costing,Coût de la demande de déplacement, Expense Type,Type de dépense, Sponsored Amount,Montant sponsorisé, @@ -6865,14 +6865,14 @@ Inspection,Inspection, Mileage,Kilométrage, Hub Tracked Item,Article suivi sur le Hub, Hub Node,Noeud du Hub, -Image List,Liste d'images, +Image List,Liste d'images, Item Manager,Gestionnaire d'Article, Hub User,Utilisateur du hub, Hub Password,Mot de passe Hub, Hub Users,Utilisateurs du Hub, Marketplace Settings,Paramètres du marché, Disable Marketplace,Désactiver le marché, -Marketplace URL (to hide and update label),URL du marché (pour masquer et mettre à jour l'étiquette), +Marketplace URL (to hide and update label),URL du marché (pour masquer et mettre à jour l'étiquette), Registered,Inscrit, Sync in Progress,Synchronisation en cours, Hub Seller Name,Nom du vendeur, @@ -6946,8 +6946,8 @@ Unpledge Time,Désengager le temps, Unpledge Type,Type de désengagement, Loan Name,Nom du Prêt, Rate of Interest (%) Yearly,Taux d'Intérêt (%) Annuel, -Penalty Interest Rate (%) Per Day,Taux d'intérêt de pénalité (%) par jour, -Penalty Interest Rate is levied on the pending interest amount on a daily basis in case of delayed repayment ,Le taux d'intérêt de pénalité est prélevé quotidiennement sur le montant des intérêts en attente en cas de retard de remboursement, +Penalty Interest Rate (%) Per Day,Taux d'intérêt de pénalité (%) par jour, +Penalty Interest Rate is levied on the pending interest amount on a daily basis in case of delayed repayment ,Le taux d'intérêt de pénalité est prélevé quotidiennement sur le montant des intérêts en attente en cas de retard de remboursement, Grace Period in Days,Délai de grâce en jours, Pledge,Gage, Post Haircut Amount,Montant de la coupe de cheveux, @@ -6961,7 +6961,7 @@ Loan Repayment Entry,Entrée de remboursement de prêt, Sanctioned Loan Amount,Montant du prêt sanctionné, Sanctioned Amount Limit,Limite de montant sanctionnée, Unpledge,Désengager, -Against Pledge,Contre l'engagement, +Against Pledge,Contre l'engagement, Haircut,la Coupe de cheveux, MAT-MSH-.YYYY.-,MAT-MSH-YYYY.-, Generate Schedule,Créer un Échéancier, @@ -7002,7 +7002,7 @@ Transfer Material Against,Transférer du matériel contre, Routing,Routage, Materials,Matériels, Quality Inspection Required,Inspection de qualité requise, -Quality Inspection Template,Modèle d'inspection de la qualité, +Quality Inspection Template,Modèle d'inspection de la qualité, Scrap,Mettre au Rebut, Scrap Items,Mettre au Rebut des Articles, Operating Cost,Coût d'Exploitation, @@ -7012,7 +7012,7 @@ Operating Cost (Company Currency),Coût d'Exploitation (Devise Société), Raw Material Cost (Company Currency),Coût de la matière première (devise de la société), Scrap Material Cost(Company Currency),Coût de Mise au Rebut des Matériaux (Devise Société), Total Cost,Coût Total, -Total Cost (Company Currency),Coût total (devise de l'entreprise), +Total Cost (Company Currency),Coût total (devise de l'entreprise), Materials Required (Exploded),Matériel Requis (Éclaté), Exploded Items,Articles éclatés, Item Image (if not slideshow),Image de l'Article (si ce n'est diaporama), @@ -7023,9 +7023,9 @@ Show Operations,Afficher Opérations, Website Description,Description du Site Web, BOM Explosion Item,Article Eclaté LDM, Qty Consumed Per Unit,Qté Consommée Par Unité, -Include Item In Manufacturing,Inclure l'article dans la fabrication, +Include Item In Manufacturing,Inclure l'article dans la fabrication, BOM Item,Article LDM, -Item operation,Opération de l'article, +Item operation,Opération de l'article, Rate & Amount,Taux et Montant, Basic Rate (Company Currency),Taux de Base (Devise de la Société ), Scrap %,% de Rebut, @@ -7118,24 +7118,24 @@ Product Bundle Item,Article d'un Ensemble de Produits, Production Plan Material Request,Demande de Matériel du Plan de Production, Production Plan Sales Order,Commande Client du Plan de Production, Sales Order Date,Date de la Commande Client, -Routing Name,Nom d'acheminement, +Routing Name,Nom d'acheminement, MFG-WO-.YYYY.-,MFG-WO-.YYYY.-, Item To Manufacture,Article à produire, Material Transferred for Manufacturing,Matériel Transféré pour la Production, Manufactured Qty,Qté Produite, Use Multi-Level BOM,Utiliser LDM à Plusieurs Niveaux, Plan material for sub-assemblies,Plan de matériaux pour les sous-ensembles, -Skip Material Transfer to WIP Warehouse,Ignorer le transfert de matériel vers l'entrepôt WIP, +Skip Material Transfer to WIP Warehouse,Ignorer le transfert de matériel vers l'entrepôt WIP, Check if material transfer entry is not required,Vérifiez si une un transfert de matériel n'est pas requis, -Backflush Raw Materials From Work-in-Progress Warehouse,Rembourrage des matières premières dans l'entrepôt de travaux en cours, +Backflush Raw Materials From Work-in-Progress Warehouse,Rembourrage des matières premières dans l'entrepôt de travaux en cours, Update Consumed Material Cost In Project,Mettre à jour le coût des matières consommées dans le projet, Warehouses,Entrepôts, -This is a location where raw materials are available.,C'est un endroit où les matières premières sont disponibles., +This is a location where raw materials are available.,C'est un endroit où les matières premières sont disponibles., Work-in-Progress Warehouse,Entrepôt des Travaux en Cours, -This is a location where operations are executed.,Il s'agit d'un emplacement où les opérations sont exécutées., -This is a location where final product stored.,Il s'agit d'un emplacement où le produit final est stocké., +This is a location where operations are executed.,Il s'agit d'un emplacement où les opérations sont exécutées., +This is a location where final product stored.,Il s'agit d'un emplacement où le produit final est stocké., Scrap Warehouse,Entrepôt de Rebut, -This is a location where scraped materials are stored.,Il s'agit d'un emplacement où les matériaux raclés sont stockés., +This is a location where scraped materials are stored.,Il s'agit d'un emplacement où les matériaux raclés sont stockés., Required Items,Articles Requis, Actual Start Date,Date de Début Réelle, Planned End Date,Date de Fin Prévue, @@ -7205,13 +7205,13 @@ Grant Description,Description de la subvention, Requested Amount,Quantité exigée, Has any past Grant Record,A obtenu des bourses par le passé, Show on Website,Afficher sur le site Web, -Assessment Mark (Out of 10),Note d'évaluation (sur 10), -Assessment Manager,Gestionnaire d'évaluation, +Assessment Mark (Out of 10),Note d'évaluation (sur 10), +Assessment Manager,Gestionnaire d'évaluation, Email Notification Sent,Notification par e-mail envoyée, NPO-MEM-.YYYY.-,NPO-MEM-YYYY.-, -Membership Expiry Date,Date d'expiration de l'adhésion, +Membership Expiry Date,Date d'expiration de l'adhésion, Non Profit Member,Membre de l'association, -Membership Status,Statut d'adhésion, +Membership Status,Statut d'adhésion, Member Since,Membre depuis, Volunteer Name,Nom du bénévole, Volunteer Type,Type de bénévole, @@ -7227,12 +7227,12 @@ Volunteer Skills,Compétences bénévoles, Volunteer Skill,Compétence bénévole, Homepage,Page d'Accueil, Hero Section Based On,Section de héros basée sur, -Homepage Section,Section de la page d'accueil, +Homepage Section,Section de la page d'accueil, Hero Section,Section de héros, Tag Line,Ligne de Tag, Company Tagline for website homepage,Slogan de la Société pour la page d'accueil du site web, Company Description for website homepage,Description de la Société pour la page d'accueil du site web, -Homepage Slideshow,Diaporama de la page d'accueil, +Homepage Slideshow,Diaporama de la page d'accueil, "URL for ""All Products""","URL pour ""Tous les Produits""", Products to be shown on website homepage,Produits destinés à être affichés sur la page d’accueil du site web, Homepage Featured Product,Produit Présenté sur la Page d'Accueil, @@ -7249,12 +7249,12 @@ Subtitle,Sous-titre, Products Settings,Paramètres des Produits, Home Page is Products,La Page d'Accueil est Produits, "If checked, the Home page will be the default Item Group for the website","Si cochée, la page d'Accueil pour le site sera le Groupe d'Article par défaut", -Show Availability Status,Afficher l'état de la disponibilité, +Show Availability Status,Afficher l'état de la disponibilité, Product Page,Page produit, Products per Page,Produits par page, Enable Field Filters,Activer les filtres de champ, -Item Fields,Champs de l'article, -Enable Attribute Filters,Activer les filtres d'attributs, +Item Fields,Champs de l'article, +Enable Attribute Filters,Activer les filtres d'attributs, Attributes,Attributs, Hide Variants,Masquer les variantes, Website Attribute,Attribut de site Web, @@ -7391,7 +7391,7 @@ October,octobre, November,novembre, December,décembre, JSON Output,Sortie JSON, -Invoices with no Place Of Supply,Factures sans lieu d'approvisionnement, +Invoices with no Place Of Supply,Factures sans lieu d'approvisionnement, Import Supplier Invoice,Importer la facture fournisseur, Invoice Series,Série de factures, Upload XML Invoices,Télécharger des factures XML, @@ -7424,7 +7424,7 @@ SAL-CAM-.YYYY.-,SAL-CAM-YYYY.-, Campaign Schedules,Horaires de campagne, Buyer of Goods and Services.,Acheteur des Biens et Services., 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, Account Manager,Gestionnaire de compte, Default Price List,Liste des Prix par Défaut, @@ -7466,7 +7466,7 @@ POS Closing Voucher Details,Détail du bon de clôture du PDV, Collected Amount,Montant collecté, Expected Amount,Montant prévu, POS Closing Voucher Invoices,Factures du bon de clôture du PDV, -Quantity of Items,Quantité d'articles, +Quantity of Items,Quantité d'articles, POS Closing Voucher Taxes,Taxes du bon de clotûre du PDV, "Aggregate group of **Items** into another **Item**. This is useful if you are bundling a certain **Items** into a package and you maintain stock of the packed **Items** and not the aggregate **Item**. \n\nThe package **Item** will have ""Is Stock Item"" as ""No"" and ""Is Sales Item"" as ""Yes"".\n\nFor Example: If you are selling Laptops and Backpacks separately and have a special price if the customer buys both, then the Laptop + Backpack will be a new Product Bundle Item.\n\nNote: BOM = Bill of Materials","Regroupement d' **Articles** dans un autre **Article**. Ceci est utile si vous regroupez certains **Articles** dans un lot et que vous maintenez l'inventaire des **Articles** du lot et non de l'**Article** composé. L'**Article** composé aura ""Article En Stock"" à ""Non"" et ""Article À Vendre"" à ""Oui"". Exemple : Si vous vendez des Ordinateurs Portables et Sacs à Dos séparément et qu'il y a un prix spécial si le client achète les deux, alors l'Ordinateur Portable + le Sac à Dos sera un nouveau Produit Groupé. Remarque: LDM = Liste\nDes Matériaux", Parent Item,Article Parent, @@ -7564,7 +7564,7 @@ Default Values,Valeurs Par Défaut, Default Holiday List,Liste de Vacances par Défaut, Standard Working Hours,Heures de travail standard, Default Selling Terms,Conditions de vente par défaut, -Default Buying Terms,Conditions d'achat par défaut, +Default Buying Terms,Conditions d'achat par défaut, Default warehouse for Sales Return,Magasin par défaut pour retour de vente, Create Chart Of Accounts Based On,Créer un Plan Comptable Basé Sur, Standard Template,Modèle Standard, @@ -7579,8 +7579,8 @@ Total Monthly Sales,Total des Ventes Mensuelles, Default Cash Account,Compte de Caisse par Défaut, Default Receivable Account,Compte Client par Défaut, Round Off Cost Center,Centre de Coûts d’Arrondi, -Discount Allowed Account,Compte d'escompte autorisé, -Discount Received Account,Compte d'escompte reçu, +Discount Allowed Account,Compte d'escompte autorisé, +Discount Received Account,Compte d'escompte reçu, Exchange Gain / Loss Account,Compte de Profits / Pertes sur Change, Unrealized Exchange Gain/Loss Account,Compte de gains / pertes de change non réalisés, Allow Account Creation Against Child Company,Autoriser la création de compte contre une entreprise enfant, @@ -7608,7 +7608,7 @@ Company Logo,Logo de la société, Date of Incorporation,Date de constitution, Date of Commencement,Date de démarrage, Phone No,N° de Téléphone, -Company Description,Description de l'entreprise, +Company Description,Description de l'entreprise, Registration Details,Informations Légales, Company registration numbers for your reference. Tax numbers etc.,"Numéro d'immatriculation de la Société pour votre référence. Numéros de taxes, etc.", Delete Company Transactions,Supprimer les Transactions de la Société, @@ -7639,15 +7639,15 @@ Bank Credit Balance,Solde bancaire, Receivables,Créances, Payables,Dettes, Sales Orders to Bill,Commandes de vente à facture, -Purchase Orders to Bill,Commandes d'achat à facturer, +Purchase Orders to Bill,Commandes d'achat à facturer, New Sales Orders,Nouvelles Commandes Client, New Purchase Orders,Nouveaux Bons de Commande, Sales Orders to Deliver,Commandes de vente à livrer, -Purchase Orders to Receive,Commandes d'achat à recevoir, -New Purchase Invoice,Nouvelle facture d'achat, +Purchase Orders to Receive,Commandes d'achat à recevoir, +New Purchase Invoice,Nouvelle facture d'achat, New Quotations,Nouveaux Devis, Open Quotations,Citations ouvertes, -Purchase Orders Items Overdue,Articles de commandes d'achat en retard, +Purchase Orders Items Overdue,Articles de commandes d'achat en retard, Add Quote,Ajouter une Citation, Global Defaults,Valeurs par Défaut Globales, Default Company,Société par Défaut, @@ -7662,7 +7662,7 @@ Item Classification,Classification de l'Article, General Settings,Paramètres Généraux, Item Group Name,Nom du Groupe d'Article, Parent Item Group,Groupe d’Articles Parent, -Item Group Defaults,Groupe d'articles par défaut, +Item Group Defaults,Groupe d'articles par défaut, Item Tax,Taxe sur l'Article, Check this if you want to show in website,Cochez cette case si vous souhaitez afficher sur le site, Show this slideshow at the top of the page,Afficher ce diaporama en haut de la page, @@ -7723,7 +7723,7 @@ Website Item Group,Groupe d'Articles du Site Web, Cross Listing of Item in multiple groups,Liste Croisée d'Articles dans plusieurs groupes, Default settings for Shopping Cart,Paramètres par défaut pour le Panier d'Achat, Enable Shopping Cart,Activer Panier, -Display Settings,Paramètres d'affichage, +Display Settings,Paramètres d'affichage, Show Public Attachments,Afficher les Pièces Jointes Publiques, Show Price,Afficher le prix, Show Stock Availability,Afficher la disponibilité du stock, @@ -7756,7 +7756,7 @@ Tariff Number,Tarif, Delivery To,Livraison à, MAT-DN-.YYYY.-,MAT-DN-.YYYY.-, Is Return,Est un Retour, -Issue Credit Note,Note de crédit d'émission, +Issue Credit Note,Note de crédit d'émission, Return Against Delivery Note,Retour contre Bon de Livraison, Customer's Purchase Order No,Numéro bon de commande du client, Billing Address Name,Nom de l'Adresse de Facturation, @@ -7783,8 +7783,8 @@ Available Batch Qty at From Warehouse,Qté de Lot Disponible Depuis l'Entrepôt, Available Qty at From Warehouse,Qté Disponible Depuis l'Entrepôt, Delivery Settings,Paramètres de livraison, Dispatch Settings,Paramètres de répartition, -Dispatch Notification Template,Modèle de notification d'expédition, -Dispatch Notification Attachment,Pièce jointe de notification d'expédition, +Dispatch Notification Template,Modèle de notification d'expédition, +Dispatch Notification Attachment,Pièce jointe de notification d'expédition, Leave blank to use the standard Delivery Note format,Laissez vide pour utiliser le format de bon de livraison standard, Send with Attachment,Envoyer avec pièce jointe, Delay between Delivery Stops,Délai entre les arrêts de livraison, @@ -7793,7 +7793,7 @@ Visited,Visité, Order Information,Informations sur la commande, Contact Information,Informations de contact, Email sent to,Email Envoyé À, -Dispatch Information,Informations d'expédition, +Dispatch Information,Informations d'expédition, Estimated Arrival,Arrivée estimée, MAT-DT-.YYYY.-,MAT-DT-.YYYY.-, Initial Email Notification Sent,Notification initiale par e-mail envoyée, @@ -7804,10 +7804,10 @@ Total Estimated Distance,Distance totale estimée, Distance UOM,Distance UOM, Departure Time,Heure de départ, Delivery Stops,Étapes de Livraison, -Calculate Estimated Arrival Times,Calculer les heures d'arrivée estimées, -Use Google Maps Direction API to calculate estimated arrival times,Utiliser l'API Google Maps Direction pour calculer les heures d'arrivée estimées, -Optimize Route,Optimiser l'itinéraire, -Use Google Maps Direction API to optimize route,Utiliser l'API Google Maps Direction pour optimiser l'itinéraire, +Calculate Estimated Arrival Times,Calculer les heures d'arrivée estimées, +Use Google Maps Direction API to calculate estimated arrival times,Utiliser l'API Google Maps Direction pour calculer les heures d'arrivée estimées, +Optimize Route,Optimiser l'itinéraire, +Use Google Maps Direction API to optimize route,Utiliser l'API Google Maps Direction pour optimiser l'itinéraire, In Transit,En transit, Fulfillment User,Livreur, "A Product or a Service that is bought, sold or kept in stock.","Un Produit ou un Service qui est acheté, vendu ou conservé en stock.", @@ -7817,7 +7817,7 @@ Is Item from Hub,Est un article sur le Hub, Default Unit of Measure,Unité de Mesure par Défaut, Maintain Stock,Maintenir Stock, Standard Selling Rate,Prix de Vente Standard, -Auto Create Assets on Purchase,Création automatique d'actifs à l'achat, +Auto Create Assets on Purchase,Création automatique d'actifs à l'achat, Asset Naming Series,Nom de série de l'actif, Over Delivery/Receipt Allowance (%),Surlivrance / indemnité de réception (%), Barcodes,Codes-barres, @@ -7839,9 +7839,9 @@ Automatically Create New Batch,Créer un Nouveau Lot Automatiquement, Batch Number Series,Série de numéros de lots, "Example: ABCD.#####. If series is set and Batch No is not mentioned in transactions, then automatic batch number will be created based on this series. If you always want to explicitly mention Batch No for this item, leave this blank. Note: this setting will take priority over the Naming Series Prefix in Stock Settings.","Exemple: ABCD. #####. Si la série est définie et que le numéro de lot n'est pas mentionné dans les transactions, un numéro de lot sera automatiquement créé en avec cette série. Si vous préferez mentionner explicitement et systématiquement le numéro de lot pour cet article, laissez ce champ vide. Remarque: ce paramètre aura la priorité sur le préfixe de la série dans les paramètres de stock.", Has Expiry Date,A une date d'expiration, -Retain Sample,Conserver l'échantillon, -Max Sample Quantity,Quantité maximum d'échantillon, -Maximum sample quantity that can be retained,Quantité maximale d'échantillon pouvant être conservée, +Retain Sample,Conserver l'échantillon, +Max Sample Quantity,Quantité maximum d'échantillon, +Maximum sample quantity that can be retained,Quantité maximale d'échantillon pouvant être conservée, Has Serial No,A un N° de Série, Serial Number Series,Séries de Numéros de Série, "Example: ABCD.#####\nIf series is set and Serial No is not mentioned in transactions, then automatic serial number will be created based on this series. If you always want to explicitly mention Serial Nos for this item. leave this blank.","Exemple:. ABCD ##### Si la série est définie et que le N° de série n'est pas mentionné dans les transactions, alors un numéro de série automatique sera créé basé sur cette série. Si vous voulez toujours mentionner explicitement les numéros de série pour ce produit. laissez ce champ vide.", @@ -7852,13 +7852,13 @@ Variant Based On,Variante Basée Sur, Item Attribute,Attribut de l'Article, "Sales, Purchase, Accounting Defaults","Valeurs par défaut pour les ventes, les achats et la comptabilité", Item Defaults,Paramètres par défaut de l'article, -"Purchase, Replenishment Details","Détails d'achat, de réapprovisionnement", +"Purchase, Replenishment Details","Détails d'achat, de réapprovisionnement", Is Purchase Item,Est Article d'Achat, Default Purchase Unit of Measure,Unité de Mesure par défaut à l'Achat, Minimum Order Qty,Qté de Commande Minimum, -Minimum quantity should be as per Stock UOM,La quantité minimale doit être conforme à l'UdM du stock, +Minimum quantity should be as per Stock UOM,La quantité minimale doit être conforme à l'UdM du stock, Average time taken by the supplier to deliver,Délai moyen de livraison par le fournisseur, -Is Customer Provided Item,L'article est-il fourni par le client?, +Is Customer Provided Item,L'article est-il fourni par le client?, Delivered by Supplier (Drop Ship),Livré par le Fournisseur (Expédition Directe), Supplier Items,Articles Fournisseur, Foreign Trade Details,Détails du Commerce Extérieur, @@ -7886,7 +7886,7 @@ Website Item Groups,Groupes d'Articles du Site Web, List this Item in multiple groups on the website.,Liste cet article dans plusieurs groupes sur le site., Copy From Item Group,Copier Depuis un Groupe d'Articles, Website Content,Contenu du site Web, -You can use any valid Bootstrap 4 markup in this field. It will be shown on your Item Page.,Vous pouvez utiliser n'importe quelle balise Bootstrap 4 valide dans ce champ. Il sera affiché sur votre page d'article., +You can use any valid Bootstrap 4 markup in this field. It will be shown on your Item Page.,Vous pouvez utiliser n'importe quelle balise Bootstrap 4 valide dans ce champ. Il sera affiché sur votre page d'article., Total Projected Qty,Qté Totale Prévue, Hub Publishing Details,Détails Publiés sur le Hub, Publish in Hub,Publier dans le Hub, @@ -7898,7 +7898,7 @@ Synced With Hub,Synchronisé avec le Hub, Item Alternative,Alternative à l'Article, Alternative Item Code,Code de l'article alternatif, Two-way,A double-sens, -Alternative Item Name,Nom de l'article alternatif, +Alternative Item Name,Nom de l'article alternatif, Attribute Name,Nom de l'Attribut, Numeric Values,Valeurs Numériques, From Range,Plage Initiale, @@ -7925,7 +7925,7 @@ Sales Defaults,Valeurs par défaut pour la vente, Default Selling Cost Center,Centre de Coût Vendeur par Défaut, Item Manufacturer,Fabricant d'Article, Item Price,Prix de l'Article, -Packing Unit,Unité d'emballage, +Packing Unit,Unité d'emballage, Quantity that must be bought or sold per UOM,Quantité à acheter ou à vendre par unité de mesure, Valid From ,Valide à Partir de, Valid Upto ,Valide Jusqu'au, @@ -8001,7 +8001,7 @@ Pick List Item,Élément de la liste de choix, Picked Qty,Quantité choisie, Price List Master,Données de Base des Listes de Prix, Price List Name,Nom de la Liste de Prix, -Price Not UOM Dependent,Prix non dépendant de l'UOM, +Price Not UOM Dependent,Prix non dépendant de l'UOM, Applicable for Countries,Applicable pour les Pays, Price List Country,Pays de la Liste des Prix, MAT-PRE-.YYYY.-,MAT-PRE-YYYY.-, @@ -8018,7 +8018,7 @@ Vehicle Date,Date du Véhicule, Received and Accepted,Reçus et Acceptés, Accepted Quantity,Quantité Acceptée, Rejected Quantity,Quantité Rejetée, -Sample Quantity,Quantité d'échantillon, +Sample Quantity,Quantité d'échantillon, Rate and Amount,Prix et Montant, MAT-QA-.YYYY.-,MAT-QA-YYYY.-, Report Date,Date du Rapport, @@ -8038,7 +8038,7 @@ Reading 7,Lecture 7, Reading 8,Lecture 8, Reading 9,Lecture 9, Reading 10,Lecture 10, -Quality Inspection Template Name,Nom du modèle d'inspection de la qualité, +Quality Inspection Template Name,Nom du modèle d'inspection de la qualité, Quick Stock Balance,Solde rapide des stocks, Available Quantity,quantité disponible, Distinct unit of an Item,Unité distincte d'un Article, @@ -8048,8 +8048,8 @@ Creation Document Type,Type de Document de Création, Creation Document No,N° du Document de Création, Creation Date,Date de Création, Creation Time,Date de Création, -Asset Details,Détails de l'actif, -Asset Status,Statut de l'actif, +Asset Details,Détails de l'actif, +Asset Status,Statut de l'actif, Delivery Document Type,Type de Document de Livraison, Delivery Document No,Numéro de Document de Livraison, Delivery Time,Heure de la Livraison, @@ -8064,13 +8064,13 @@ Out of AMC,Sur AMC, Warranty Period (Days),Période de Garantie (Jours), Serial No Details,Détails du N° de Série, MAT-STE-.YYYY.-,MAT-STE-.YYYY.-, -Stock Entry Type,Type d'entrée de stock, +Stock Entry Type,Type d'entrée de stock, Stock Entry (Outward GIT),Entrée de stock (GIT sortant), Material Consumption for Manufacture,Consommation de matériaux pour la production, Repack,Ré-emballer, Send to Subcontractor,Envoyer au sous-traitant, -Send to Warehouse,Envoyer à l'entrepôt, -Receive at Warehouse,Recevez à l'entrepôt, +Send to Warehouse,Envoyer à l'entrepôt, +Receive at Warehouse,Recevez à l'entrepôt, Delivery Note No,Bon de Livraison N°, Sales Invoice No,N° de la Facture de Vente, Purchase Receipt No,N° du Reçu d'Achat, @@ -8080,9 +8080,9 @@ For Quantity,Pour la Quantité, As per Stock UOM,Selon UDM du Stock, Including items for sub assemblies,Incluant les articles pour des sous-ensembles, Default Source Warehouse,Entrepôt Source par Défaut, -Source Warehouse Address,Adresse de l'entrepôt source, +Source Warehouse Address,Adresse de l'entrepôt source, Default Target Warehouse,Entrepôt Cible par Défaut, -Target Warehouse Address,Adresse de l'entrepôt cible, +Target Warehouse Address,Adresse de l'entrepôt cible, Update Rate and Availability,Mettre à Jour le Prix et la Disponibilité, Total Incoming Value,Valeur Entrante Totale, Total Outgoing Value,Valeur Sortante Totale, @@ -8102,7 +8102,7 @@ Subcontracted Item,Article sous-traité, Against Stock Entry,Contre entrée de stock, Stock Entry Child,Entrée de stock enfant, PO Supplied Item,PO article fourni, -Reference Purchase Receipt,Reçu d'achat de référence, +Reference Purchase Receipt,Reçu d'achat de référence, Stock Ledger Entry,Écriture du Livre d'Inventaire, Outgoing Rate,Taux Sortant, Actual Qty After Transaction,Qté Réelle Après Transaction, @@ -8126,9 +8126,9 @@ Default Stock UOM,UDM par Défaut des Articles, Sample Retention Warehouse,Entrepôt de stockage des échantillons, Default Valuation Method,Méthode de Valorisation par Défaut, Percentage you are allowed to receive or deliver more against the quantity ordered. For example: If you have ordered 100 units. and your Allowance is 10% then you are allowed to receive 110 units.,Pourcentage que vous êtes autorisé à recevoir ou à livrer en plus de la quantité commandée. Par exemple : Si vous avez commandé 100 unités et que votre allocation est de 10% alors que vous êtes autorisé à recevoir 110 unités., -Action if Quality inspection is not submitted,Action si l'inspection qualité n'est pas soumise, +Action if Quality inspection is not submitted,Action si l'inspection qualité n'est pas soumise, Show Barcode Field,Afficher Champ Code Barre, -Convert Item Description to Clean HTML,Convertir la description de l'élément pour nettoyer le code HTML, +Convert Item Description to Clean HTML,Convertir la description de l'élément pour nettoyer le code HTML, Auto insert Price List rate if missing,Insertion automatique du taux de la Liste de Prix si manquante, Allow Negative Stock,Autoriser un Stock Négatif, Automatically Set Serial Nos based on FIFO,Régler Automatiquement les Nos de Série basés sur FIFO, @@ -8162,7 +8162,7 @@ Service Level Agreement Fulfilled,Contrat de niveau de service rempli, Ongoing,En cours, Resolution By,Résolution de, Resolution By Variance,Résolution par variance, -Service Level Agreement Creation,Création d'un contrat de niveau de service, +Service Level Agreement Creation,Création d'un contrat de niveau de service, Mins to First Response,Minutes avant la Première Réponse, First Responded On,Première Réponse Le, Resolution Details,Détails de la Résolution, @@ -8171,7 +8171,7 @@ Opening Time,Horaire d'Ouverture, Resolution Date,Date de Résolution, Via Customer Portal,Via le portail client, Support Team,Équipe de Support, -Issue Priority,Priorité d'émission, +Issue Priority,Priorité d'émission, Service Day,Jour de service, Workday,Journée de travail, Holiday List (ignored during SLA calculation),Liste de jours fériés (ignorée lors du calcul du contrat de niveau de service), @@ -8182,7 +8182,7 @@ Support Hours,Heures de Support, Support and Resolution,Support et résolution, Default Service Level Agreement,Contrat de niveau de service par défaut, Entity,Entité, -Agreement Details,Détails de l'accord, +Agreement Details,Détails de l'accord, Response and Resolution Time,Temps de réponse et de résolution, Service Level Priority,Priorité de niveau de service, Response Time,Temps de réponse, @@ -8202,11 +8202,11 @@ Post Description Key,Clé de description du message, Link Options,Options du lien, Source DocType,DocType source, Result Title Field,Champ du titre du résultat, -Result Preview Field,Champ d'aperçu du résultat, +Result Preview Field,Champ d'aperçu du résultat, Result Route Field,Champ du lien du résultat, Service Level Agreements,Accords de Niveau de Service, Track Service Level Agreement,Suivi du contrat de niveau de service, -Allow Resetting Service Level Agreement,Autoriser la réinitialisation de l'accord de niveau de service, +Allow Resetting Service Level Agreement,Autoriser la réinitialisation de l'accord de niveau de service, Close Issue After Days,Nbre de jours avant de fermer le ticket, Auto close Issue after 7 days,Fermer automatiquement le ticket après 7 jours, Support Portal,Portail du support, @@ -8263,12 +8263,12 @@ Course wise Assessment Report,Rapport d'Évaluation par Cours, Customer Acquisition and Loyalty,Acquisition et Fidélisation des Clients, Customer Credit Balance,Solde de Crédit des Clients, Customer Ledger Summary,Récapitulatif client, -Customer-wise Item Price,Prix de l'article par client, +Customer-wise Item Price,Prix de l'article par client, Customers Without Any Sales Transactions,Clients sans transactions de vente, Daily Timesheet Summary,Récapitulatif Quotidien des Feuilles de Présence, Daily Work Summary Replies,Réponses au récapitulatif de travail quotidien, DATEV,DATEV, -Delayed Item Report,Rapport d'élément retardé, +Delayed Item Report,Rapport d'élément retardé, Delayed Order Report,Rapport de commande retardé, Delivered Items To Be Billed,Articles Livrés à Facturer, Delivery Note Trends,Tendance des Bordereaux de Livraisons, @@ -8305,7 +8305,7 @@ Item Price Stock,Stock et prix de l'article, Item Prices,Prix des Articles, Item Shortage Report,Rapport de Rupture de Stock d'Article, Project Quantity,Quantité de Projet, -Item Variant Details,Détails de la variante de l'article, +Item Variant Details,Détails de la variante de l'article, Item-wise Price List Rate,Taux de la Liste des Prix par Article, Item-wise Purchase History,Historique d'Achats par Article, Item-wise Purchase Register,Registre des Achats par Article, @@ -8395,11 +8395,11 @@ Supplier-Wise Sales Analytics,Analyse des Ventes par Fournisseur, Support Hour Distribution,Répartition des Heures de Support, TDS Computation Summary,Résumé des calculs TDS, TDS Payable Monthly,TDS Payable Monthly, -Territory Target Variance Based On Item Group,Écart de cible de territoire basé sur un groupe d'articles, +Territory Target Variance Based On Item Group,Écart de cible de territoire basé sur un groupe d'articles, Territory-wise Sales,Ventes par territoire, Total Stock Summary,Récapitulatif de l'Inventaire Total, Trial Balance,Balance Générale, -Trial Balance (Simple),Balance d'essai (simple), +Trial Balance (Simple),Balance d'essai (simple), Trial Balance for Party,Balance Auxiliaire, Unpaid Expense Claim,Note de Frais Impayée, Warehouse wise Item Balance Age and Value,Balance des articles par entrepôt, From 2c3c8aaa2dc9599522beb2e3d4d53ede68ca70d8 Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Fri, 29 May 2020 21:55:38 +0530 Subject: [PATCH 02/66] fix: submitted sales order can be updated with no permission --- erpnext/controllers/accounts_controller.py | 46 ++++++++++++++----- erpnext/public/js/utils.js | 7 +++ .../doctype/sales_order/test_sales_order.py | 16 +++++++ .../sales_order_item/sales_order_item.json | 28 +++++------ 4 files changed, 71 insertions(+), 26 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index eecb143d556..ca78070bf4e 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1137,8 +1137,8 @@ def set_sales_order_defaults(parent_doctype, parent_doctype_name, child_docname, child_item.item_name = item.item_name child_item.description = item.description child_item.delivery_date = trans_item.get('delivery_date') or p_doc.delivery_date + child_item.conversion_factor = flt(d.get('conversion_factor')) or get_conversion_factor(item.item_code, item.stock_uom).get("conversion_factor") or 1.0 child_item.uom = item.stock_uom - child_item.conversion_factor = get_conversion_factor(item.item_code, item.stock_uom).get("conversion_factor") or 1.0 child_item.warehouse = get_item_warehouse(item, p_doc, overwrite_warehouse=True) if not child_item.warehouse: frappe.throw(_("Cannot find {} for item {}. Please set the same in Item Master or Stock Settings.") @@ -1157,8 +1157,8 @@ def set_purchase_order_defaults(parent_doctype, parent_doctype_name, child_docna child_item.item_name = item.item_name child_item.description = item.description child_item.schedule_date = trans_item.get('schedule_date') or p_doc.schedule_date + child_item.conversion_factor = flt(d.get('conversion_factor')) or get_conversion_factor(item.item_code, item.stock_uom).get("conversion_factor") or 1.0 child_item.uom = item.stock_uom - child_item.conversion_factor = get_conversion_factor(item.item_code, item.stock_uom).get("conversion_factor") or 1.0 child_item.base_rate = 1 # Initiallize value will update in parent validation child_item.base_amount = 1 # Initiallize value will update in parent validation return child_item @@ -1190,6 +1190,26 @@ def check_and_delete_children(parent, data): @frappe.whitelist() def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, child_docname="items"): + def check_permissions(doc, perm_type='create'): + try: + doc.check_permission(perm_type) + except: + action = "add" if perm_type == 'create' else "update" + frappe.throw(_("You do not have permissions to {} items in a Sales Order.").format(action), title=_("Insufficient Permissions")) + + def get_new_child_item(): + if parent_doctype == "Sales Order": + return set_sales_order_defaults(parent_doctype, parent_doctype_name, child_docname, d) + if parent_doctype == "Purchase Order": + return set_purchase_order_defaults(parent_doctype, parent_doctype_name, child_docname, d) + + def validate_quantity(child_item, d): + if parent_doctype == "Sales Order" and flt(d.get("qty")) < flt(child_item.delivered_qty): + frappe.throw(_("Cannot set quantity less than delivered quantity")) + + if parent_doctype == "Purchase Order" and flt(d.get("qty")) < flt(child_item.received_qty): + frappe.throw(_("Cannot set quantity less than received quantity")) + data = json.loads(trans_items) sales_doctypes = ['Sales Order', 'Sales Invoice', 'Delivery Note', 'Quotation'] @@ -1201,20 +1221,19 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil new_child_flag = False if not d.get("docname"): new_child_flag = True - if parent_doctype == "Sales Order": - child_item = set_sales_order_defaults(parent_doctype, parent_doctype_name, child_docname, d) - if parent_doctype == "Purchase Order": - child_item = set_purchase_order_defaults(parent_doctype, parent_doctype_name, child_docname, d) + check_permissions(parent, 'create') + child_item = get_new_child_item() else: + check_permissions(parent, 'write') child_item = frappe.get_doc(parent_doctype + ' Item', d.get("docname")) - if flt(child_item.get("rate")) == flt(d.get("rate")) and flt(child_item.get("qty")) == flt(d.get("qty")): + + rate_unchanged = flt(child_item.get("rate")) == flt(d.get("rate")) + qty_unchanged = flt(child_item.get("qty")) == flt(d.get("qty")) + conversion_factor_unchanged = flt(child_item.get("conversion_factor")) == flt(d.get("conversion_factor")) + if rate_unchanged and qty_unchanged and conversion_factor_changed: continue - if parent_doctype == "Sales Order" and flt(d.get("qty")) < flt(child_item.delivered_qty): - frappe.throw(_("Cannot set quantity less than delivered quantity")) - - if parent_doctype == "Purchase Order" and flt(d.get("qty")) < flt(child_item.received_qty): - frappe.throw(_("Cannot set quantity less than received quantity")) + validate_quantity(child_item, d) child_item.qty = flt(d.get("qty")) precision = child_item.precision("rate") or 2 @@ -1224,6 +1243,9 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil .format(child_item.idx, child_item.item_code)) else: child_item.rate = flt(d.get("rate")) + + if d.get("conversion_factor"): + child_item.conversion_factor = flt(d.get('conversion_factor')) if flt(child_item.price_list_rate): if flt(child_item.rate) > flt(child_item.price_list_rate): diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 58969f2a9fd..a487f83fe64 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -472,6 +472,12 @@ erpnext.utils.update_child_items = function(opts) { in_list_view: 1, label: frm.doc.doctype == 'Sales Order' ? __("Delivery Date") : __("Reqd by date") }) + fields.splice(3, 0, { + fieldtype: 'Float', + fieldname: "conversion_factor", + in_list_view: 1, + label: __("UOM Conversion Factor") + }) } const dialog = new frappe.ui.Dialog({ @@ -519,6 +525,7 @@ erpnext.utils.update_child_items = function(opts) { "item_code": d.item_code, "delivery_date": d.delivery_date, "schedule_date": d.schedule_date, + "conversion_factor": d.conversion_factor, "qty": d.qty, "rate": d.rate, }); diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index b8b0d404e50..90f9b094d1e 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -400,6 +400,22 @@ class TestSalesOrder(unittest.TestCase): trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 2, 'docname': so.items[0].name}]) self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Sales Order', trans_item, so.name) + def test_update_child_qty_rate_perm(self): + so = make_sales_order(item_code= "_Test Item", qty=4) + + user = 'test@example.com' + test_user = frappe.get_doc('User', user) + test_user.add_roles("Accounts User") + frappe.set_user(user) + + # update qty + trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 7, 'docname': so.items[0].name}]) + self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Sales Order', trans_item, so.name) + + # add new item + trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 100, 'qty' : 2}]) + self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Sales Order', trans_item, so.name) + def test_warehouse_user(self): frappe.permissions.add_user_permission("Warehouse", "_Test Warehouse 1 - _TC", "test@example.com") frappe.permissions.add_user_permission("Warehouse", "_Test Warehouse 2 - _TC1", "test2@example.com") diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json index e59349926e6..18691591cd5 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -214,7 +214,6 @@ "fieldtype": "Link", "label": "UOM", "options": "UOM", - "print_hide": 0, "reqd": 1 }, { @@ -769,22 +768,23 @@ "label": "Against Blanket Order" }, { - "fieldname": "bom_no", - "fieldtype": "Link", - "label": "BOM No", - "no_copy": 1, - "options": "BOM", - "print_hide": 1 - }, - { - "fieldname": "manufacturing_section_section", - "fieldtype": "Section Break", - "label": "Manufacturing Section" - } + "fieldname": "bom_no", + "fieldtype": "Link", + "label": "BOM No", + "no_copy": 1, + "options": "BOM", + "print_hide": 1 + }, + { + "fieldname": "manufacturing_section_section", + "fieldtype": "Section Break", + "label": "Manufacturing Section" + } ], "idx": 1, "istable": 1, - "modified": "2020-05-15 18:13:43.006493", + "links": [], + "modified": "2020-05-29 20:54:32.309460", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order Item", From 5da8b98a048bf16cd4bd396f5a5eaf4f2d07d150 Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Fri, 29 May 2020 21:59:01 +0530 Subject: [PATCH 03/66] fix: label --- erpnext/public/js/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index a487f83fe64..1803fcdfd78 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -476,7 +476,7 @@ erpnext.utils.update_child_items = function(opts) { fieldtype: 'Float', fieldname: "conversion_factor", in_list_view: 1, - label: __("UOM Conversion Factor") + label: __("Conversion Factor") }) } From c579b0879ec170ea1a24cbaed8b7cc8d6c655da3 Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Fri, 29 May 2020 22:21:50 +0530 Subject: [PATCH 04/66] fix: cannot update delivery date --- erpnext/controllers/accounts_controller.py | 24 ++++++++++++++++++---- erpnext/public/js/utils.js | 3 ++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index ca78070bf4e..43a27333236 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1227,10 +1227,20 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil check_permissions(parent, 'write') child_item = frappe.get_doc(parent_doctype + ' Item', d.get("docname")) - rate_unchanged = flt(child_item.get("rate")) == flt(d.get("rate")) - qty_unchanged = flt(child_item.get("qty")) == flt(d.get("qty")) - conversion_factor_unchanged = flt(child_item.get("conversion_factor")) == flt(d.get("conversion_factor")) - if rate_unchanged and qty_unchanged and conversion_factor_changed: + prev_rate, new_rate = flt(child_item.get("rate")), flt(d.get("rate")) + prev_qty, new_qty = flt(child_item.get("qty")), flt(d.get("qty")) + prev_con_fac, new_con_fac = flt(child_item.get("conversion_factor")), flt(d.get("conversion_factor")) + + if parent_doctype == 'Sales Order': + prev_date, new_date = child_item.get("delivery_date"), d.get("delivery_date") + elif parent_doctype == 'Purchase Order': + prev_date, new_date = child_item.get("schedule_date") == d.get("schedule_date") + + rate_unchanged = prev_rate == new_rate + qty_unchanged = prev_qty == prev_qty + conversion_factor_unchanged = prev_con_fac == new_con_fac + date_unchanged = prev_date == new_date if prev_date and new_date else False # in case of delivery note etc + if rate_unchanged and qty_unchanged and conversion_factor_unchanged and date_unchanged: continue validate_quantity(child_item, d) @@ -1247,6 +1257,12 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil if d.get("conversion_factor"): child_item.conversion_factor = flt(d.get('conversion_factor')) + if d.get("delivery_date") and parent_doctype == 'Sales Order': + child_item.delivery_date = d.get('delivery_date') + + if d.get("schedule_date") and parent_doctype == 'Purchase Order': + child_item.schedule_date = d.get('schedule_date') + if flt(child_item.price_list_rate): if flt(child_item.rate) > flt(child_item.price_list_rate): # if rate is greater than price_list_rate, set margin diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 1803fcdfd78..b10ec98d4cc 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -470,7 +470,8 @@ erpnext.utils.update_child_items = function(opts) { fieldtype: 'Date', fieldname: frm.doc.doctype == 'Sales Order' ? "delivery_date" : "schedule_date", in_list_view: 1, - label: frm.doc.doctype == 'Sales Order' ? __("Delivery Date") : __("Reqd by date") + label: frm.doc.doctype == 'Sales Order' ? __("Delivery Date") : __("Reqd by date"), + reqd: 1 }) fields.splice(3, 0, { fieldtype: 'Float', From a655db6a79e58f152229d84f0bb08d45ee69b392 Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Fri, 29 May 2020 22:44:59 +0530 Subject: [PATCH 05/66] fix: unexpected removal of print hide field --- erpnext/selling/doctype/sales_order_item/sales_order_item.json | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json index 18691591cd5..eff17f8bc78 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -214,6 +214,7 @@ "fieldtype": "Link", "label": "UOM", "options": "UOM", + "print_hide": 0, "reqd": 1 }, { From 24f9a80e7d6cfc2eddfa6e0831ee573e06051308 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 3 Jun 2020 10:59:37 +0530 Subject: [PATCH 06/66] fix(India): Reverse charge mechanism for GST --- erpnext/hooks.py | 3 ++ .../gstr_3b_report/gstr_3b_report.html | 2 +- .../doctype/gstr_3b_report/gstr_3b_report.py | 12 ++--- erpnext/regional/india/utils.py | 52 ++++++++++++++++++- 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 9d7cdc2a3b9..742cc8efbd1 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -238,6 +238,9 @@ doc_events = { "on_cancel": "erpnext.regional.italy.utils.sales_invoice_on_cancel", "on_trash": "erpnext.regional.check_deletion_permission" }, + "Purchase Invoice": { + "on_submit": "erpnext.regional.india.utils.make_reverse_charge_entries" + }, "Payment Entry": { "on_submit": ["erpnext.regional.create_transaction_log", "erpnext.accounts.doctype.payment_request.payment_request.update_payment_req_status"], "on_trash": "erpnext.regional.check_deletion_permission" diff --git a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.html b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.html index 35f9cf674ce..888b2da48eb 100644 --- a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.html +++ b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.html @@ -52,7 +52,7 @@ - (d) {{__("Inward Supplies(liable to reverse charge")}} + (d) {{__("Inward Supplies(liable to reverse charge)")}} {{ flt(data.sup_details.isup_rev.txval, 2) }} {{ flt(data.sup_details.isup_rev.iamt, 2) }} {{ flt(data.sup_details.isup_rev.camt, 2) }} diff --git a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py index 9e7a023926d..2691552d802 100644 --- a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py +++ b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py @@ -158,7 +158,7 @@ class GSTR3BReport(Document): self.prepare_data("Sales Invoice", outward_supply_tax_amounts, "sup_details", "osup_det", ["Registered Regular"]) self.prepare_data("Sales Invoice", outward_supply_tax_amounts, "sup_details", "osup_zero", ["SEZ", "Deemed Export", "Overseas"]) - self.prepare_data("Purchase Invoice", inward_supply_tax_amounts, "sup_details", "isup_rev", ["Registered Regular"], reverse_charge="Y") + self.prepare_data("Purchase Invoice", inward_supply_tax_amounts, "sup_details", "isup_rev", ["Unregistered"], reverse_charge="Y") self.report_dict["sup_details"]["osup_nil_exmp"]["txval"] = flt(self.get_nil_rated_supply_value(), 2) self.set_itc_details(itc_details) @@ -196,11 +196,12 @@ class GSTR3BReport(Document): if d["ty"] == 'ISRC': reverse_charge = "Y" + itc_type = 'All Other ITC' + gst_category = 'Unregistered' else: reverse_charge = "N" for account_head in self.account_heads: - d["iamt"] += flt(itc_details.get((gst_category, itc_type, reverse_charge, account_head.get('igst_account')), {}).get("amount"), 2) d["camt"] += flt(itc_details.get((gst_category, itc_type, reverse_charge, account_head.get('cgst_account')), {}).get("amount"), 2) d["samt"] += flt(itc_details.get((gst_category, itc_type, reverse_charge, account_head.get('sgst_account')), {}).get("amount"), 2) @@ -274,17 +275,16 @@ class GSTR3BReport(Document): """ #nosec .format(doctype = doctype), (self.month_no, self.year, reverse_charge, self.company, self.gst_details.get("gstin")))) - def get_itc_details(self, reverse_charge='N'): - + def get_itc_details(self): itc_amount = frappe.db.sql(""" select s.gst_category, sum(t.tax_amount_after_discount_amount) as tax_amount, t.account_head, s.eligibility_for_itc, s.reverse_charge from `tabPurchase Invoice` s , `tabPurchase Taxes and Charges` t - where s.docstatus = 1 and t.parent = s.name and s.reverse_charge = %s + where s.docstatus = 1 and t.parent = s.name and month(s.posting_date) = %s and year(s.posting_date) = %s and s.company = %s and s.company_gstin = %s group by t.account_head, s.gst_category, s.eligibility_for_itc """, - (reverse_charge, self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1) + (self.month_no, self.year, self.company, self.gst_details.get("gstin")), as_dict=1) itc_details = {} diff --git a/erpnext/regional/india/utils.py b/erpnext/regional/india/utils.py index 3085a310c41..9fe29eba1b8 100644 --- a/erpnext/regional/india/utils.py +++ b/erpnext/regional/india/utils.py @@ -9,6 +9,8 @@ from erpnext.hr.utils import get_salary_assignment from erpnext.hr.doctype.salary_structure.salary_structure import make_salary_slip from erpnext.regional.india import number_state_mapping from six import string_types +from erpnext.accounts.general_ledger import make_gl_entries +from erpnext.accounts.utils import get_account_currency def validate_gstin_for_india(doc, method): if hasattr(doc, 'gst_state') and doc.gst_state: @@ -658,5 +660,53 @@ def get_gst_accounts(company, account_wise=False): elif val: gst_accounts[val] = acc - return gst_accounts + +def make_reverse_charge_entries(doc, method): + country = frappe.get_cached_value('Company', doc.company, 'country') + + if country != 'India': + return + + if doc.reverse_charge == 'Y': + gl_entries = [] + gst_accounts = get_gst_accounts(doc.company) + gst_account_list = gst_accounts.get('cgst_account') + gst_accounts.get('sgst_account') \ + + gst_accounts.get('igst_account') + + for tax in doc.get('taxes'): + if tax.category not in ("Total", "Valuation and Total"): + continue + + if flt(tax.base_tax_amount_after_discount_amount) and tax.account_head in gst_account_list: + account_currency = get_account_currency(tax.account_head) + + gl_entries.append(doc.get_gl_dict( + { + "account": tax.account_head, + "cost_center": tax.cost_center, + "posting_date": doc.posting_date, + "against": doc.supplier, + "credit": tax.base_tax_amount_after_discount_amount, + "credits_in_account_currency": tax.base_tax_amount_after_discount_amount \ + if account_currency==doc.company_currency \ + else tax.tax_amount_after_discount_amount + }, account_currency, item=tax) + ) + + gl_entries.append(doc.get_gl_dict( + { + "account": doc.credit_to if doc.doctype == 'Purchase Invoice' else doc.debit_to, + "cost_center": doc.cost_center, + "posting_date": doc.posting_date, + "party_type": 'Supplier', + "party": doc.supplier, + "against": tax.account_head, + "debit": tax.base_tax_amount_after_discount_amount, + "debit_in_account_currency": tax.base_tax_amount_after_discount_amount \ + if account_currency==doc.company_currency \ + else tax.tax_amount_after_discount_amount + }, account_currency, item=doc) + ) + + make_gl_entries(gl_entries) \ No newline at end of file From f596b5950ebd137abfdfb9b32cbd944743d5f3cb Mon Sep 17 00:00:00 2001 From: Abhishek Balam Date: Fri, 12 Jun 2020 11:07:28 +0530 Subject: [PATCH 07/66] indent to tabs --- .../customer_acquisition_and_loyalty.py | 310 +++++++++--------- 1 file changed, 155 insertions(+), 155 deletions(-) diff --git a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py index 88bd9c135d5..7cdad4a5141 100644 --- a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py +++ b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py @@ -8,180 +8,180 @@ from frappe import _ from frappe.utils import cint, cstr def execute(filters=None): - common_columns = [ - { - 'label': _('New Customers'), - 'fieldname': 'new_customers', - 'fieldtype': 'Int', - 'default': 0, - 'width': 125 - }, - { - 'label': _('Repeat Customers'), - 'fieldname': 'repeat_customers', - 'fieldtype': 'Int', - 'default': 0, - 'width': 125 - }, - { - 'label': _('Total'), - 'fieldname': 'total', - 'fieldtype': 'Int', - 'default': 0, - 'width': 100 - }, - { - 'label': _('New Customer Revenue'), - 'fieldname': 'new_customer_revenue', - 'fieldtype': 'Currency', - 'default': 0.0, - 'width': 175 - }, - { - 'label': _('Repeat Customer Revenue'), - 'fieldname': 'repeat_customer_revenue', - 'fieldtype': 'Currency', - 'default': 0.0, - 'width': 175 - }, - { - 'label': _('Total Revenue'), - 'fieldname': 'total_revenue', - 'fieldtype': 'Currency', - 'default': 0.0, - 'width': 175 - } - ] - if filters.get('view_type') == 'Monthly': - return get_data_by_time(filters, common_columns) - else: - return get_data_by_territory(filters, common_columns) + common_columns = [ + { + 'label': _('New Customers'), + 'fieldname': 'new_customers', + 'fieldtype': 'Int', + 'default': 0, + 'width': 125 + }, + { + 'label': _('Repeat Customers'), + 'fieldname': 'repeat_customers', + 'fieldtype': 'Int', + 'default': 0, + 'width': 125 + }, + { + 'label': _('Total'), + 'fieldname': 'total', + 'fieldtype': 'Int', + 'default': 0, + 'width': 100 + }, + { + 'label': _('New Customer Revenue'), + 'fieldname': 'new_customer_revenue', + 'fieldtype': 'Currency', + 'default': 0.0, + 'width': 175 + }, + { + 'label': _('Repeat Customer Revenue'), + 'fieldname': 'repeat_customer_revenue', + 'fieldtype': 'Currency', + 'default': 0.0, + 'width': 175 + }, + { + 'label': _('Total Revenue'), + 'fieldname': 'total_revenue', + 'fieldtype': 'Currency', + 'default': 0.0, + 'width': 175 + } + ] + if filters.get('view_type') == 'Monthly': + return get_data_by_time(filters, common_columns) + else: + return get_data_by_territory(filters, common_columns) def get_data_by_time(filters, common_columns): - # key yyyy-mm - columns = [ - { - 'label': _('Year'), - 'fieldname': 'year', - 'fieldtype': 'Data', - 'width': 100 - }, - { - 'label': _('Month'), - 'fieldname': 'month', - 'fieldtype': 'Data', - 'width': 100 - }, - ] - columns += common_columns + # key yyyy-mm + columns = [ + { + 'label': _('Year'), + 'fieldname': 'year', + 'fieldtype': 'Data', + 'width': 100 + }, + { + 'label': _('Month'), + 'fieldname': 'month', + 'fieldtype': 'Data', + 'width': 100 + }, + ] + columns += common_columns - customers_in = get_customer_stats(filters) + customers_in = get_customer_stats(filters) - # time series - from_year, from_month, temp = filters.get('from_date').split('-') - to_year, to_month, temp = filters.get('to_date').split('-') + # time series + from_year, from_month, temp = filters.get('from_date').split('-') + to_year, to_month, temp = filters.get('to_date').split('-') - from_year, from_month, to_year, to_month = \ - cint(from_year), cint(from_month), cint(to_year), cint(to_month) + from_year, from_month, to_year, to_month = \ + cint(from_year), cint(from_month), cint(to_year), cint(to_month) - out = [] - for year in range(from_year, to_year+1): - for month in range(from_month if year==from_year else 1, (to_month+1) if year==to_year else 13): - key = '{year}-{month:02d}'.format(year=year, month=month) - data = customers_in.get(key) - new = data['new'] if data else [0, 0.0] - repeat = data['repeat'] if data else [0, 0.0] - out.append({ - 'year': cstr(year), - 'month': calendar.month_name[month], - 'new_customers': new[0], - 'repeat_customers': repeat[0], - 'total': new[0] + repeat[0], - 'new_customer_revenue': new[1], - 'repeat_customer_revenue': repeat[1], - 'total_revenue': new[1] + repeat[1] - }) - return columns, out + out = [] + for year in range(from_year, to_year+1): + for month in range(from_month if year==from_year else 1, (to_month+1) if year==to_year else 13): + key = '{year}-{month:02d}'.format(year=year, month=month) + data = customers_in.get(key) + new = data['new'] if data else [0, 0.0] + repeat = data['repeat'] if data else [0, 0.0] + out.append({ + 'year': cstr(year), + 'month': calendar.month_name[month], + 'new_customers': new[0], + 'repeat_customers': repeat[0], + 'total': new[0] + repeat[0], + 'new_customer_revenue': new[1], + 'repeat_customer_revenue': repeat[1], + 'total_revenue': new[1] + repeat[1] + }) + return columns, out def get_data_by_territory(filters, common_columns): - columns = [{ - 'label': 'Territory', - 'fieldname': 'territory', - 'fieldtype': 'Link', - 'options': 'Territory', - 'width': 150 - }] - columns += common_columns + columns = [{ + 'label': 'Territory', + 'fieldname': 'territory', + 'fieldtype': 'Link', + 'options': 'Territory', + 'width': 150 + }] + columns += common_columns - customers_in = get_customer_stats(filters, tree_view=True) + customers_in = get_customer_stats(filters, tree_view=True) - territory_dict = {} - for t in frappe.db.sql('''SELECT name, lft, parent_territory, is_group FROM `tabTerritory` ORDER BY lft''', as_dict=1): - territory_dict.update({ - t.name: { - 'parent': t.parent_territory, - 'is_group': t.is_group - } - }) + territory_dict = {} + for t in frappe.db.sql('''SELECT name, lft, parent_territory, is_group FROM `tabTerritory` ORDER BY lft''', as_dict=1): + territory_dict.update({ + t.name: { + 'parent': t.parent_territory, + 'is_group': t.is_group + } + }) - depth_map = frappe._dict() - for name, info in territory_dict.items(): - default = depth_map.get(info['parent']) + 1 if info['parent'] else 0 - depth_map.setdefault(name, default) + depth_map = frappe._dict() + for name, info in territory_dict.items(): + default = depth_map.get(info['parent']) + 1 if info['parent'] else 0 + depth_map.setdefault(name, default) - data = [] - for name, indent in depth_map.items(): - condition = customers_in.get(name) - new = customers_in[name]['new'] if condition else [0, 0.0] - repeat = customers_in[name]['repeat'] if condition else [0, 0.0] - temp = { - 'territory': name, - 'parent_territory': territory_dict[name]['parent'], - 'indent': indent, - 'new_customers': new[0], - 'repeat_customers': repeat[0], - 'total': new[0] + repeat[0], - 'new_customer_revenue': new[1], - 'repeat_customer_revenue': repeat[1], - 'total_revenue': new[1] + repeat[1], - 'bold': 0 if indent else 1 - } - data.append(temp) + data = [] + for name, indent in depth_map.items(): + condition = customers_in.get(name) + new = customers_in[name]['new'] if condition else [0, 0.0] + repeat = customers_in[name]['repeat'] if condition else [0, 0.0] + temp = { + 'territory': name, + 'parent_territory': territory_dict[name]['parent'], + 'indent': indent, + 'new_customers': new[0], + 'repeat_customers': repeat[0], + 'total': new[0] + repeat[0], + 'new_customer_revenue': new[1], + 'repeat_customer_revenue': repeat[1], + 'total_revenue': new[1] + repeat[1], + 'bold': 0 if indent else 1 + } + data.append(temp) - loop_data = sorted(data, key=lambda k: k['indent'], reverse=True) + loop_data = sorted(data, key=lambda k: k['indent'], reverse=True) - for ld in loop_data: - if ld['parent_territory']: - parent_data = [x for x in data if x['territory'] == ld['parent_territory']][0] - for key in parent_data.keys(): - if key not in ['indent', 'territory', 'parent_territory', 'bold']: - parent_data[key] += ld[key] + for ld in loop_data: + if ld['parent_territory']: + parent_data = [x for x in data if x['territory'] == ld['parent_territory']][0] + for key in parent_data.keys(): + if key not in ['indent', 'territory', 'parent_territory', 'bold']: + parent_data[key] += ld[key] - return columns, data, None, None, None, 1 + return columns, data, None, None, None, 1 def get_customer_stats(filters, tree_view=False): - """ Calculates number of new and repeated customers. """ - company_condition = '' - if filters.get('company'): - company_condition = ' and company=%(company)s' + """ Calculates number of new and repeated customers and revenue. """ + company_condition = '' + if filters.get('company'): + company_condition = ' and company=%(company)s' - customers = [] - customers_in = {} + customers = [] + customers_in = {} - for si in frappe.db.sql('''select territory, posting_date, customer, base_grand_total from `tabSales Invoice` - where docstatus=1 and posting_date <= %(to_date)s and posting_date >= %(from_date)s - {company_condition} order by posting_date'''.format(company_condition=company_condition), - filters, as_dict=1): + for si in frappe.db.sql('''select territory, posting_date, customer, base_grand_total from `tabSales Invoice` + where docstatus=1 and posting_date <= %(to_date)s + {company_condition} order by posting_date'''.format(company_condition=company_condition), + filters, as_dict=1): - key = si.territory if tree_view else si.posting_date.strftime('%Y-%m') - customers_in.setdefault(key, {'new': [0, 0.0], 'repeat': [0, 0.0]}) + key = si.territory if tree_view else si.posting_date.strftime('%Y-%m') + customers_in.setdefault(key, {'new': [0, 0.0], 'repeat': [0, 0.0]}) - if not si.customer in customers: - customers_in[key]['new'][0] += 1 - customers_in[key]['new'][1] += si.base_grand_total - customers.append(si.customer) - else: - customers_in[key]['repeat'][0] += 1 - customers_in[key]['repeat'][1] += si.base_grand_total + if not si.customer in customers: + customers_in[key]['new'][0] += 1 + customers_in[key]['new'][1] += si.base_grand_total + customers.append(si.customer) + else: + customers_in[key]['repeat'][0] += 1 + customers_in[key]['repeat'][1] += si.base_grand_total - return customers_in + return customers_in \ No newline at end of file From 72450d2af30ded6d2a66b8a47dc2a4b92fb14414 Mon Sep 17 00:00:00 2001 From: Abhishek Balam Date: Fri, 12 Jun 2020 11:07:57 +0530 Subject: [PATCH 08/66] add revenue if within date range --- .../customer_acquisition_and_loyalty.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py index 7cdad4a5141..0ab6eda6478 100644 --- a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py +++ b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py @@ -175,13 +175,16 @@ def get_customer_stats(filters, tree_view=False): key = si.territory if tree_view else si.posting_date.strftime('%Y-%m') customers_in.setdefault(key, {'new': [0, 0.0], 'repeat': [0, 0.0]}) + revenue_condition = (filters.from_date <= si.posting_date.strftime('%Y-%m-%d')) if not si.customer in customers: customers_in[key]['new'][0] += 1 - customers_in[key]['new'][1] += si.base_grand_total + if revenue_condition: + customers_in[key]['new'][1] += si.base_grand_total customers.append(si.customer) else: customers_in[key]['repeat'][0] += 1 - customers_in[key]['repeat'][1] += si.base_grand_total + if revenue_condition: + customers_in[key]['repeat'][1] += si.base_grand_total return customers_in \ No newline at end of file From 996b306cdae6417492e9866ab3dfca27943c9d72 Mon Sep 17 00:00:00 2001 From: Abhishek Balam Date: Fri, 12 Jun 2020 11:38:07 +0530 Subject: [PATCH 09/66] fix territory count --- .../customer_acquisition_and_loyalty.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py index 0ab6eda6478..4288b52acac 100644 --- a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py +++ b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py @@ -174,17 +174,15 @@ def get_customer_stats(filters, tree_view=False): filters, as_dict=1): key = si.territory if tree_view else si.posting_date.strftime('%Y-%m') + new_or_repeat = 'new' if si.customer not in customers else 'repeat' + customers_in.setdefault(key, {'new': [0, 0.0], 'repeat': [0, 0.0]}) revenue_condition = (filters.from_date <= si.posting_date.strftime('%Y-%m-%d')) - if not si.customer in customers: - customers_in[key]['new'][0] += 1 - if revenue_condition: - customers_in[key]['new'][1] += si.base_grand_total + if revenue_condition: + customers_in[key][new_or_repeat][0] += 1 + customers_in[key][new_or_repeat][1] += si.base_grand_total + if new_or_repeat == 'new': customers.append(si.customer) - else: - customers_in[key]['repeat'][0] += 1 - if revenue_condition: - customers_in[key]['repeat'][1] += si.base_grand_total return customers_in \ No newline at end of file From f9c4b209853569df89db57d1456b3d8128f7aa3e Mon Sep 17 00:00:00 2001 From: marination Date: Fri, 12 Jun 2020 15:49:53 +0530 Subject: [PATCH 10/66] fix: Added PO test and conversion factor fix - Don't change conversion factor if stock uom and uom is the same - Added PO test - Added Accounts User basic role in PO - Minor fixes, wrong variables --- .../purchase_order/purchase_order.json | 8 ++++++- .../purchase_order/test_purchase_order.py | 22 ++++++++++++++++--- erpnext/controllers/accounts_controller.py | 15 ++++++++----- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index a4f60fbba5c..64dc3ed324b 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -1068,7 +1068,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2020-04-24 12:13:14.186280", + "modified": "2020-06-12 14:08:11.777120", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", @@ -1112,6 +1112,12 @@ "read": 1, "role": "Purchase Manager", "write": 1 + }, + { + "email": 1, + "print": 1, + "read": 1, + "role": "Accounts User" } ], "search_fields": "status, transaction_date, supplier,grand_total", diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 1712369e60b..3d6cba891a6 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -118,7 +118,7 @@ class TestPurchaseOrder(unittest.TestCase): self.assertEqual(po.get("items")[0].amount, 1400) self.assertEqual(get_ordered_qty(), existing_ordered_qty + 3) - + def test_add_new_item_in_update_child_qty_rate(self): po = create_purchase_order(do_not_save=1) po.items[0].qty = 4 @@ -144,7 +144,7 @@ class TestPurchaseOrder(unittest.TestCase): self.assertEquals(len(po.get('items')), 2) self.assertEqual(po.status, 'To Receive and Bill') - + def test_remove_item_in_update_child_qty_rate(self): po = create_purchase_order(do_not_save=1) po.items[0].qty = 4 @@ -185,6 +185,22 @@ class TestPurchaseOrder(unittest.TestCase): self.assertEquals(len(po.get('items')), 1) self.assertEqual(po.status, 'To Receive and Bill') + def test_update_child_qty_rate_perm(self): + po = create_purchase_order(item_code= "_Test Item", qty=4) + + user = 'test@example.com' + test_user = frappe.get_doc('User', user) + test_user.add_roles("Accounts User") + frappe.set_user(user) + + # update qty + trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 7, 'docname': po.items[0].name}]) + self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Purchase Order', trans_item, po.name) + + # add new item + trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 100, 'qty' : 2}]) + self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Purchase Order', trans_item, po.name) + def test_update_qty(self): po = create_purchase_order() @@ -689,7 +705,7 @@ class TestPurchaseOrder(unittest.TestCase): po.save() self.assertEqual(po.schedule_date, add_days(nowdate(), 2)) - + def test_po_optional_blanket_order(self): """ Expected result: Blanket order Ordered Quantity should only be affected on Purchase Order with against_blanket_order = 1. diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 43a27333236..c75aff9264e 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1137,7 +1137,7 @@ def set_sales_order_defaults(parent_doctype, parent_doctype_name, child_docname, child_item.item_name = item.item_name child_item.description = item.description child_item.delivery_date = trans_item.get('delivery_date') or p_doc.delivery_date - child_item.conversion_factor = flt(d.get('conversion_factor')) or get_conversion_factor(item.item_code, item.stock_uom).get("conversion_factor") or 1.0 + child_item.conversion_factor = flt(trans_item.get('conversion_factor')) or get_conversion_factor(item.item_code, item.stock_uom).get("conversion_factor") or 1.0 child_item.uom = item.stock_uom child_item.warehouse = get_item_warehouse(item, p_doc, overwrite_warehouse=True) if not child_item.warehouse: @@ -1157,7 +1157,7 @@ def set_purchase_order_defaults(parent_doctype, parent_doctype_name, child_docna child_item.item_name = item.item_name child_item.description = item.description child_item.schedule_date = trans_item.get('schedule_date') or p_doc.schedule_date - child_item.conversion_factor = flt(d.get('conversion_factor')) or get_conversion_factor(item.item_code, item.stock_uom).get("conversion_factor") or 1.0 + child_item.conversion_factor = flt(trans_item.get('conversion_factor')) or get_conversion_factor(item.item_code, item.stock_uom).get("conversion_factor") or 1.0 child_item.uom = item.stock_uom child_item.base_rate = 1 # Initiallize value will update in parent validation child_item.base_amount = 1 # Initiallize value will update in parent validation @@ -1237,7 +1237,7 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil prev_date, new_date = child_item.get("schedule_date") == d.get("schedule_date") rate_unchanged = prev_rate == new_rate - qty_unchanged = prev_qty == prev_qty + qty_unchanged = prev_qty == new_qty conversion_factor_unchanged = prev_con_fac == new_con_fac date_unchanged = prev_date == new_date if prev_date and new_date else False # in case of delivery note etc if rate_unchanged and qty_unchanged and conversion_factor_unchanged and date_unchanged: @@ -1253,13 +1253,16 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil .format(child_item.idx, child_item.item_code)) else: child_item.rate = flt(d.get("rate")) - + if d.get("conversion_factor"): - child_item.conversion_factor = flt(d.get('conversion_factor')) + if child_item.stock_uom == child_item.uom: + child_item.conversion_factor = 1 + else: + child_item.conversion_factor = flt(d.get('conversion_factor')) if d.get("delivery_date") and parent_doctype == 'Sales Order': child_item.delivery_date = d.get('delivery_date') - + if d.get("schedule_date") and parent_doctype == 'Purchase Order': child_item.schedule_date = d.get('schedule_date') From ec54653852a954381838c4616cb52283d0e9b82e Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Fri, 12 Jun 2020 17:02:31 +0530 Subject: [PATCH 11/66] fix: Child is shown in Parent process if added from tree view --- .../doctype/quality_procedure/quality_procedure.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py index d29710dd8e3..44405c15077 100644 --- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py +++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py @@ -10,7 +10,7 @@ from frappe import _ class QualityProcedure(NestedSet): nsm_parent_field = 'parent_quality_procedure' - def before_save(self): + def on_save(self): for process in self.processes: if process.procedure: doc = frappe.get_doc("Quality Procedure", process.procedure) @@ -23,6 +23,11 @@ class QualityProcedure(NestedSet): def after_insert(self): self.set_parent() + #if Child is Added through Tree View. + if self.parent_quality_procedure: + parent_quality_procedure = frappe.get_doc("Quality Procedure", self.parent_quality_procedure) + parent_quality_procedure.append("processes", {"procedure": self.name}) + parent_quality_procedure.save() def on_trash(self): if self.parent_quality_procedure: From 5bf6bec6567fd6f3d6e12af233c0d4c5af872255 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 14 Jun 2020 13:18:08 +0530 Subject: [PATCH 12/66] fix: Consider Overseas category in RCM --- .../doctype/gstr_3b_report/gstr_3b_report.py | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py index 2691552d802..619734ff263 100644 --- a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py +++ b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py @@ -158,7 +158,7 @@ class GSTR3BReport(Document): self.prepare_data("Sales Invoice", outward_supply_tax_amounts, "sup_details", "osup_det", ["Registered Regular"]) self.prepare_data("Sales Invoice", outward_supply_tax_amounts, "sup_details", "osup_zero", ["SEZ", "Deemed Export", "Overseas"]) - self.prepare_data("Purchase Invoice", inward_supply_tax_amounts, "sup_details", "isup_rev", ["Unregistered"], reverse_charge="Y") + self.prepare_data("Purchase Invoice", inward_supply_tax_amounts, "sup_details", "isup_rev", ["Unregistered", "Overseas"], reverse_charge="Y") self.report_dict["sup_details"]["osup_nil_exmp"]["txval"] = flt(self.get_nil_rated_supply_value(), 2) self.set_itc_details(itc_details) @@ -192,32 +192,27 @@ class GSTR3BReport(Document): for d in self.report_dict["itc_elg"]["itc_avl"]: itc_type = itc_type_map.get(d["ty"]) - gst_category = "Registered Regular" + gst_category = ["Registered Regular"] if d["ty"] == 'ISRC': reverse_charge = "Y" itc_type = 'All Other ITC' - gst_category = 'Unregistered' + gst_category = ['Unregistered', 'Overseas'] else: reverse_charge = "N" for account_head in self.account_heads: - d["iamt"] += flt(itc_details.get((gst_category, itc_type, reverse_charge, account_head.get('igst_account')), {}).get("amount"), 2) - d["camt"] += flt(itc_details.get((gst_category, itc_type, reverse_charge, account_head.get('cgst_account')), {}).get("amount"), 2) - d["samt"] += flt(itc_details.get((gst_category, itc_type, reverse_charge, account_head.get('sgst_account')), {}).get("amount"), 2) - d["csamt"] += flt(itc_details.get((gst_category, itc_type, reverse_charge, account_head.get('cess_account')), {}).get("amount"), 2) + for category in gst_category: + for key in [['iamt', 'igst_account'], ['camt', 'cgst_account'], ['samt', 'sgst_account'], ['csamt', 'cess_account']]: + d[key[0]] += flt(itc_details.get((category, itc_type, reverse_charge, account_head.get(key[1])), {}).get("amount"), 2) - net_itc["iamt"] += flt(d["iamt"], 2) - net_itc["camt"] += flt(d["camt"], 2) - net_itc["samt"] += flt(d["samt"], 2) - net_itc["csamt"] += flt(d["csamt"], 2) + for key in ['iamt', 'camt', 'samt', 'csamt']: + net_itc[key] += flt(d[key], 2) for account_head in self.account_heads: itc_inelg = self.report_dict["itc_elg"]["itc_inelg"][1] - itc_inelg["iamt"] = flt(itc_details.get(("Ineligible", "N", account_head.get("igst_account")), {}).get("amount"), 2) - itc_inelg["camt"] = flt(itc_details.get(("Ineligible", "N", account_head.get("cgst_account")), {}).get("amount"), 2) - itc_inelg["samt"] = flt(itc_details.get(("Ineligible", "N", account_head.get("sgst_account")), {}).get("amount"), 2) - itc_inelg["csamt"] = flt(itc_details.get(("Ineligible", "N", account_head.get("cess_account")), {}).get("amount"), 2) + for key in [['iamt', 'igst_account'], ['camt', 'cgst_account'], ['samt', 'sgst_account'], ['csamt', 'cess_account']]: + itc_inelg[key[0]] = flt(itc_details.get(("Ineligible", "N", account_head.get(key[1])), {}).get("amount"), 2) def prepare_data(self, doctype, tax_details, supply_type, supply_category, gst_category_list, reverse_charge="N"): From 6c4a24a6c31b5d2a04757191afa1a4fa5670fdc1 Mon Sep 17 00:00:00 2001 From: Abhishek Balam Date: Mon, 15 Jun 2020 11:36:56 +0530 Subject: [PATCH 13/66] cleanup --- .../customer_acquisition_and_loyalty.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py index 8967c6bad9f..d10b1ca88f6 100644 --- a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py +++ b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py @@ -175,11 +175,9 @@ def get_customer_stats(filters, tree_view=False): key = si.territory if tree_view else si.posting_date.strftime('%Y-%m') new_or_repeat = 'new' if si.customer not in customers else 'repeat' - customers_in.setdefault(key, {'new': [0, 0.0], 'repeat': [0, 0.0]}) - revenue_condition = (filters.from_date <= si.posting_date.strftime('%Y-%m-%d')) - if revenue_condition: + if filters.from_date <= si.posting_date.strftime('%Y-%m-%d'): customers_in[key][new_or_repeat][0] += 1 customers_in[key][new_or_repeat][1] += si.base_grand_total if new_or_repeat == 'new': From 359e934cd23ca31839a540791c5694680203543b Mon Sep 17 00:00:00 2001 From: marination Date: Mon, 15 Jun 2020 11:32:42 +0530 Subject: [PATCH 14/66] fix: Travis --- erpnext/buying/doctype/purchase_order/test_purchase_order.py | 1 + erpnext/controllers/accounts_controller.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 3d6cba891a6..813286f7fa4 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -200,6 +200,7 @@ class TestPurchaseOrder(unittest.TestCase): # add new item trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 100, 'qty' : 2}]) self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Purchase Order', trans_item, po.name) + frappe.set_user("Administrator") def test_update_qty(self): po = create_purchase_order() diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index c75aff9264e..837ffe3c8cb 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1234,7 +1234,7 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil if parent_doctype == 'Sales Order': prev_date, new_date = child_item.get("delivery_date"), d.get("delivery_date") elif parent_doctype == 'Purchase Order': - prev_date, new_date = child_item.get("schedule_date") == d.get("schedule_date") + prev_date, new_date = child_item.get("schedule_date"), d.get("schedule_date") rate_unchanged = prev_rate == new_rate qty_unchanged = prev_qty == new_qty From 817cbc4b48f7d00bcbfe84c6e2b600e355cce8db Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Mon, 15 Jun 2020 12:07:04 +0530 Subject: [PATCH 15/66] fix: Minor fixes in cost center --- erpnext/accounts/doctype/cost_center/cost_center.js | 12 +++++++++--- .../accounts/doctype/cost_center/cost_center.json | 2 +- erpnext/accounts/utils.py | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/cost_center/cost_center.js b/erpnext/accounts/doctype/cost_center/cost_center.js index f341f782078..ee23b1be5c5 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.js +++ b/erpnext/accounts/doctype/cost_center/cost_center.js @@ -71,8 +71,13 @@ frappe.ui.form.on('Cost Center', { "label": "Cost Center Number", "fieldname": "cost_center_number", "fieldtype": "Data", - "reqd": 1, "default": frm.doc.cost_center_number + }, + { + "label": __("Merge with existing"), + "fieldname": "merge", + "fieldtype": "Check", + "default": 0 } ], primary_action: function() { @@ -87,8 +92,9 @@ frappe.ui.form.on('Cost Center', { args: { docname: frm.doc.name, cost_center_name: data.cost_center_name, - cost_center_number: data.cost_center_number, - company: frm.doc.company + cost_center_number: cstr(data.cost_center_number), + company: frm.doc.company, + merge: data.merge }, callback: function(r) { frappe.dom.unfreeze(); diff --git a/erpnext/accounts/doctype/cost_center/cost_center.json b/erpnext/accounts/doctype/cost_center/cost_center.json index c9bbbabe798..9c3573b18f9 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.json +++ b/erpnext/accounts/doctype/cost_center/cost_center.json @@ -146,7 +146,7 @@ "idx": 1, "is_tree": 1, "links": [], - "modified": "2020-04-29 16:09:30.025214", + "modified": "2020-06-12 16:09:30.025214", "modified_by": "Administrator", "module": "Accounts", "name": "Cost Center", diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 5165495786d..176370c6b6c 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -817,7 +817,7 @@ def create_payment_gateway_account(gateway): pass @frappe.whitelist() -def update_cost_center(docname, cost_center_name, cost_center_number, company): +def update_cost_center(docname, cost_center_name, cost_center_number, company, merge): ''' Renames the document by adding the number as a prefix to the current name and updates all transaction where it was present. @@ -833,7 +833,7 @@ def update_cost_center(docname, cost_center_name, cost_center_number, company): new_name = get_autoname_with_number(cost_center_number, cost_center_name, docname, company) if docname != new_name: - frappe.rename_doc("Cost Center", docname, new_name, force=1) + frappe.rename_doc("Cost Center", docname, new_name, force=1, merge=merge) return new_name def validate_field_number(doctype_name, docname, number_value, company, field_name): From b7e94cc742c6407bb5f223ce9f75ef52583332f0 Mon Sep 17 00:00:00 2001 From: marination Date: Mon, 15 Jun 2020 11:32:42 +0530 Subject: [PATCH 16/66] fix: Travis --- erpnext/buying/doctype/purchase_order/test_purchase_order.py | 1 + erpnext/controllers/accounts_controller.py | 2 +- erpnext/selling/doctype/sales_order/test_sales_order.py | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 3d6cba891a6..813286f7fa4 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -200,6 +200,7 @@ class TestPurchaseOrder(unittest.TestCase): # add new item trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 100, 'qty' : 2}]) self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Purchase Order', trans_item, po.name) + frappe.set_user("Administrator") def test_update_qty(self): po = create_purchase_order() diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index c75aff9264e..837ffe3c8cb 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1234,7 +1234,7 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil if parent_doctype == 'Sales Order': prev_date, new_date = child_item.get("delivery_date"), d.get("delivery_date") elif parent_doctype == 'Purchase Order': - prev_date, new_date = child_item.get("schedule_date") == d.get("schedule_date") + prev_date, new_date = child_item.get("schedule_date"), d.get("schedule_date") rate_unchanged = prev_rate == new_rate qty_unchanged = prev_qty == new_qty diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 90f9b094d1e..74e742fabbb 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -415,6 +415,7 @@ class TestSalesOrder(unittest.TestCase): # add new item trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 100, 'qty' : 2}]) self.assertRaises(frappe.ValidationError, update_child_qty_rate,'Sales Order', trans_item, so.name) + frappe.set_user("Administrator") def test_warehouse_user(self): frappe.permissions.add_user_permission("Warehouse", "_Test Warehouse 1 - _TC", "test@example.com") From 0d880079b197c15374a7fe81f543d58be70ae24c Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Mon, 15 Jun 2020 12:23:24 +0530 Subject: [PATCH 17/66] fix: Validation for group cost center --- erpnext/accounts/doctype/gl_entry/gl_entry.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index 291aff3f5ad..645da341a3e 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe, erpnext from frappe import _ -from frappe.utils import flt, fmt_money, getdate, formatdate +from frappe.utils import flt, fmt_money, getdate, formatdate, cint from frappe.model.document import Document from frappe.model.naming import set_name_from_naming_options from frappe.model.meta import get_field_precision @@ -134,10 +134,17 @@ class GLEntry(Document): return self.cost_center_company[self.cost_center] + def _check_is_group(): + return cint(frappe.get_cached_value('Cost Center', self.cost_center, 'is_group')) + if self.cost_center and _get_cost_center_company() != self.company: frappe.throw(_("{0} {1}: Cost Center {2} does not belong to Company {3}") .format(self.voucher_type, self.voucher_no, self.cost_center, self.company)) + if self.cost_center and _check_is_group(): + frappe.throw(_("""{0} {1}: Cost Center {2} is a group cost center and group cost centers cannot + be used in transactions""").format(self.voucher_type, self.voucher_no, frappe.bold(self.cost_center))) + def validate_party(self): validate_party_frozen_disabled(self.party_type, self.party) From ae862c993ba0123cb19217c2a8b108d1f0297a37 Mon Sep 17 00:00:00 2001 From: marination Date: Mon, 15 Jun 2020 17:38:47 +0530 Subject: [PATCH 18/66] feat: Multi UOM support in Request for Quotation --- .../request_for_quotation.py | 2 + .../test_request_for_quotation.py | 48 ++++++++++++++----- .../request_for_quotation_item.json | 43 ++++++++++++++--- erpnext/patches.txt | 1 + erpnext/patches/v12_0/set_multi_uom_in_rfq.py | 29 +++++++++++ 5 files changed, 104 insertions(+), 19 deletions(-) create mode 100644 erpnext/patches/v12_0/set_multi_uom_in_rfq.py diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py index 95db33b0f8f..dfdb487f9e0 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py @@ -25,6 +25,7 @@ class RequestforQuotation(BuyingController): self.validate_duplicate_supplier() self.validate_supplier_list() validate_for_items(self) + super(RequestforQuotation, self).set_qty_as_per_stock_uom() self.update_email_id() def validate_duplicate_supplier(self): @@ -278,6 +279,7 @@ def create_rfq_items(sq_doc, supplier, data): "description": data.description, "qty": data.qty, "rate": data.rate, + "conversion_factor": data.conversion_factor if data.conversion_factor else None, "supplier_part_no": frappe.db.get_value("Item Supplier", {'parent': data.item_code, 'supplier': supplier}, "supplier_part_no"), "warehouse": data.warehouse or '', "request_for_quotation_item": data.name, diff --git a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py index dbd9f022789..3de9526c4f2 100644 --- a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py @@ -6,12 +6,14 @@ from __future__ import unicode_literals import unittest import frappe -from erpnext.templates.pages.rfq import check_supplier_has_docname_access from frappe.utils import nowdate +from erpnext.stock.doctype.item.test_item import make_item +from erpnext.templates.pages.rfq import check_supplier_has_docname_access +from erpnext.buying.doctype.request_for_quotation.request_for_quotation import make_supplier_quotation +from erpnext.buying.doctype.request_for_quotation.request_for_quotation import create_supplier_quotation class TestRequestforQuotation(unittest.TestCase): def test_quote_status(self): - from erpnext.buying.doctype.request_for_quotation.request_for_quotation import make_supplier_quotation rfq = make_request_for_quotation() self.assertEqual(rfq.get('suppliers')[0].quote_status, 'Pending') @@ -31,7 +33,6 @@ class TestRequestforQuotation(unittest.TestCase): self.assertEqual(rfq.get('suppliers')[1].quote_status, 'No Quote') def test_make_supplier_quotation(self): - from erpnext.buying.doctype.request_for_quotation.request_for_quotation import make_supplier_quotation rfq = make_request_for_quotation() sq = make_supplier_quotation(rfq.name, rfq.get('suppliers')[0].supplier) @@ -51,15 +52,13 @@ class TestRequestforQuotation(unittest.TestCase): self.assertEqual(sq1.get('items')[0].qty, 5) def test_make_supplier_quotation_with_special_characters(self): - from erpnext.buying.doctype.request_for_quotation.request_for_quotation import make_supplier_quotation - frappe.delete_doc_if_exists("Supplier", "_Test Supplier '1", force=1) supplier = frappe.new_doc("Supplier") supplier.supplier_name = "_Test Supplier '1" supplier.supplier_group = "_Test Supplier Group" supplier.insert() - rfq = make_request_for_quotation(supplier_wt_appos) + rfq = make_request_for_quotation(supplier_data=supplier_wt_appos) sq = make_supplier_quotation(rfq.name, supplier_wt_appos[0].get("supplier")) sq.submit() @@ -76,7 +75,6 @@ class TestRequestforQuotation(unittest.TestCase): frappe.form_dict.name = None def test_make_supplier_quotation_from_portal(self): - from erpnext.buying.doctype.request_for_quotation.request_for_quotation import create_supplier_quotation rfq = make_request_for_quotation() rfq.get('items')[0].rate = 100 rfq.supplier = rfq.suppliers[0].supplier @@ -90,12 +88,34 @@ class TestRequestforQuotation(unittest.TestCase): self.assertEqual(supplier_quotation_doc.get('items')[0].qty, 5) self.assertEqual(supplier_quotation_doc.get('items')[0].amount, 500) + def test_make_multi_uom_supplier_quotation(self): + item_code = "_Test Multi UOM RFQ Item" + if not frappe.db.exists('Item', item_code): + item = make_item(item_code, {'stock_uom': '_Test UOM'}) + row = item.append('uoms', { + 'uom': 'Kg', + 'conversion_factor': 2 + }) + row.db_update() -def make_request_for_quotation(supplier_data=None): + rfq = make_request_for_quotation(item_code="_Test Multi UOM RFQ Item", uom="Kg", conversion_factor=2) + rfq.get('items')[0].rate = 100 + rfq.supplier = rfq.suppliers[0].supplier + + self.assertEqual(rfq.items[0].stock_qty, 10) + + supplier_quotation_name = create_supplier_quotation(rfq) + supplier_quotation = frappe.get_doc('Supplier Quotation', supplier_quotation_name) + + self.assertEqual(supplier_quotation.items[0].qty, 5) + self.assertEqual(supplier_quotation.items[0].stock_qty, 10) + +def make_request_for_quotation(**args): """ :param supplier_data: List containing supplier data """ - supplier_data = supplier_data if supplier_data else get_supplier_data() + args = frappe._dict(args) + supplier_data = args.get("supplier_data") if args.get("supplier_data") else get_supplier_data() rfq = frappe.new_doc('Request for Quotation') rfq.transaction_date = nowdate() rfq.status = 'Draft' @@ -106,11 +126,13 @@ def make_request_for_quotation(supplier_data=None): rfq.append('suppliers', data) rfq.append("items", { - "item_code": "_Test Item", + "item_code": args.item_code or "_Test Item", "description": "_Test Item", - "uom": "_Test UOM", - "qty": 5, - "warehouse": "_Test Warehouse - _TC", + "uom": args.uom or "_Test UOM", + "stock_uom": args.stock_uom or "_Test UOM", + "qty": args.qty or 5, + "conversion_factor": args.conversion_factor or 1.0, + "warehouse": args.warehouse or "_Test Warehouse - _TC", "schedule_date": nowdate() }) diff --git a/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json b/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json index 0159df962ec..408f49f5233 100644 --- a/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json +++ b/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json @@ -1,4 +1,5 @@ { + "actions": [], "autoname": "hash", "creation": "2016-02-25 08:04:02.452958", "doctype": "DocType", @@ -9,6 +10,7 @@ "supplier_part_no", "column_break_3", "item_name", + "schedule_date", "section_break_5", "description", "item_group", @@ -18,9 +20,11 @@ "image_view", "quantity", "qty", + "stock_uom", "col_break2", - "schedule_date", "uom", + "conversion_factor", + "stock_qty", "warehouse_and_reference", "warehouse", "project_name", @@ -33,7 +37,7 @@ "fields": [ { "bold": 1, - "columns": 3, + "columns": 2, "fieldname": "item_code", "fieldtype": "Link", "in_list_view": 1, @@ -98,7 +102,7 @@ { "fieldname": "quantity", "fieldtype": "Section Break", - "label": "Quantity" + "label": "Quantity & Stock" }, { "bold": 1, @@ -129,12 +133,12 @@ { "fieldname": "uom", "fieldtype": "Link", + "in_list_view": 1, "label": "UOM", "oldfieldname": "uom", "oldfieldtype": "Link", "options": "UOM", "print_width": "100px", - "read_only": 1, "reqd": 1, "width": "100px" }, @@ -144,7 +148,7 @@ "label": "Warehouse and Reference" }, { - "columns": 3, + "columns": 2, "fieldname": "warehouse", "fieldtype": "Link", "in_list_view": 1, @@ -202,6 +206,7 @@ }, { "allow_on_submit": 1, + "default": "0", "fieldname": "page_break", "fieldtype": "Check", "label": "Page Break", @@ -219,10 +224,36 @@ { "fieldname": "section_break_23", "fieldtype": "Section Break" + }, + { + "fieldname": "stock_uom", + "fieldtype": "Link", + "label": "Stock UOM", + "options": "UOM", + "print_hide": 1, + "read_only": 1, + "reqd": 1 + }, + { + "fieldname": "conversion_factor", + "fieldtype": "Float", + "label": "UOM Conversion Factor", + "print_hide": 1, + "read_only": 1, + "reqd": 1 + }, + { + "fieldname": "stock_qty", + "fieldtype": "Float", + "label": "Qty as per Stock UOM", + "no_copy": 1, + "print_hide": 1, + "read_only": 1 } ], "istable": 1, - "modified": "2019-05-01 17:50:23.703801", + "links": [], + "modified": "2020-06-12 19:10:36.333441", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation Item", diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 1f5d4d563ae..e999cfedc10 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -696,3 +696,4 @@ execute:frappe.rename_doc("Desk Page", "Loan Management", "Loan", force=True) erpnext.patches.v12_0.update_uom_conversion_factor erpnext.patches.v13_0.delete_old_purchase_reports erpnext.patches.v12_0.set_italian_import_supplier_invoice_permissions +erpnext.patches.v12_0.set_multi_uom_in_rfq diff --git a/erpnext/patches/v12_0/set_multi_uom_in_rfq.py b/erpnext/patches/v12_0/set_multi_uom_in_rfq.py new file mode 100644 index 00000000000..50725bb69dd --- /dev/null +++ b/erpnext/patches/v12_0/set_multi_uom_in_rfq.py @@ -0,0 +1,29 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe.utils import flt +from erpnext.stock.get_item_details import get_conversion_factor + +def execute(): + frappe.reload_doc('buying', 'doctype', 'request_for_quotation_item') + + for rfq_item in frappe.db.sql("""SELECT name, item_code, uom, qty FROM `tabRequest for Quotation Item` WHERE docstatus<2""", as_dict=1): + item_code, uom, qty = rfq_item.get("item_code"), rfq_item.get("uom"), rfq_item.get("qty") + conversion_factor = get_conversion_factor(item_code, uom).get("conversion_factor") or 1.0 + + filters = { + "name" : rfq_item.get("name"), + "stock_uom" : frappe.db.get_value("Item", item_code, "stock_uom"), + "conversion_factor" : conversion_factor, + "stock_qty" : flt(qty) * flt(conversion_factor) + } + + frappe.db.sql("""UPDATE `tabRequest for Quotation Item` + SET + stock_uom= %(stock_uom)s, + conversion_factor = %(conversion_factor)s, + stock_qty = %(stock_qty)s + WHERE + name = %(name)s""", filters) \ No newline at end of file From a4cd9e2389a5485b4079f534b21be4d53bfd3494 Mon Sep 17 00:00:00 2001 From: Abhishek Balam Date: Wed, 17 Jun 2020 17:13:13 +0530 Subject: [PATCH 19/66] use getdate() for comparing dates --- .../customer_acquisition_and_loyalty.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py index d10b1ca88f6..f15f63d7bb7 100644 --- a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py +++ b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import calendar import frappe from frappe import _ -from frappe.utils import cint, cstr +from frappe.utils import cint, cstr, getdate def execute(filters=None): common_columns = [ @@ -177,7 +177,8 @@ def get_customer_stats(filters, tree_view=False): new_or_repeat = 'new' if si.customer not in customers else 'repeat' customers_in.setdefault(key, {'new': [0, 0.0], 'repeat': [0, 0.0]}) - if filters.from_date <= si.posting_date.strftime('%Y-%m-%d'): + # if filters.from_date <= si.posting_date.strftime('%Y-%m-%d'): + if getdate(filters.from_date) <= getdate(si.posting_date): customers_in[key][new_or_repeat][0] += 1 customers_in[key][new_or_repeat][1] += si.base_grand_total if new_or_repeat == 'new': From 8b19d01d577c565b35c62500266915bfc23bec6a Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 17 Jun 2020 17:26:03 +0530 Subject: [PATCH 20/66] fix: Quality Procedure Fixes - Dont prompt error message if parent is the same in child - filter child procedure field - Disable New button in tree view - Editable grid for Quality Procedure Proces table. --- .../quality_procedure/quality_procedure.js | 9 ++++++++ .../quality_procedure/quality_procedure.json | 3 ++- .../quality_procedure/quality_procedure.py | 23 ++++++++++++------- .../quality_procedure_tree.js | 1 + .../quality_procedure_process.json | 5 +++- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.js b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.js index ded3a51dd60..357bd654a7c 100644 --- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.js +++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.js @@ -2,4 +2,13 @@ // For license information, please see license.txt frappe.ui.form.on('Quality Procedure', { + refresh: function(frm) { + frm.set_query("procedure","processes", (frm) =>{ + return { + filters: { + name: ["not in", [frm.parent_quality_procedure, frm.name]] + } + } + }) + } }); \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.json b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.json index 6df116c430c..b3c0d948909 100644 --- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.json +++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.json @@ -1,5 +1,6 @@ { "actions": [], + "allow_rename": 1, "autoname": "format:PRC-{quality_procedure_name}", "creation": "2018-10-06 00:06:29.756804", "doctype": "DocType", @@ -72,7 +73,7 @@ ], "is_tree": 1, "links": [], - "modified": "2020-03-18 18:09:29.371627", + "modified": "2020-06-17 17:25:03.434953", "modified_by": "Administrator", "module": "Quality Management", "name": "Quality Procedure", diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py index 44405c15077..ea544f67339 100644 --- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py +++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py @@ -10,13 +10,8 @@ from frappe import _ class QualityProcedure(NestedSet): nsm_parent_field = 'parent_quality_procedure' - def on_save(self): - for process in self.processes: - if process.procedure: - doc = frappe.get_doc("Quality Procedure", process.procedure) - if doc.parent_quality_procedure: - frappe.throw(_("{0} already has a Parent Procedure {1}.").format(process.procedure, doc.parent_quality_procedure)) - self.is_group = 1 + def before_save(self): + self.check_for_incorrect_child() def on_update(self): self.set_parent() @@ -48,11 +43,23 @@ class QualityProcedure(NestedSet): def set_parent(self): for process in self.processes: - if process.procedure: + # Set parent for only those children who don't have a parent + parent_quality_procedure = frappe.db.get_value("Quality Procedure", process.procedure, "parent_quality_procedure") + if not parent_quality_procedure and process.procedure: doc = frappe.get_doc("Quality Procedure", process.procedure) doc.parent_quality_procedure = self.name doc.save(ignore_permissions=True) + def check_for_incorrect_child(self): + for process in self.processes: + if process.procedure: + # Check if any child process belongs to another parent. + parent_quality_procedure = frappe.db.get_value("Quality Procedure", process.procedure, "parent_quality_procedure") + if parent_quality_procedure and parent_quality_procedure != self.name: + frappe.throw(_("{0} already has a Parent Procedure {1}.".format(frappe.bold(process.procedure), frappe.bold(parent_quality_procedure))), + title=_("Invalid Child Procedure")) + self.is_group = 1 + @frappe.whitelist() def get_children(doctype, parent=None, parent_quality_procedure=None, is_root=False): if parent is None or parent == "All Quality Procedures": diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure_tree.js b/erpnext/quality_management/doctype/quality_procedure/quality_procedure_tree.js index 6df6f656aa1..ef48ab6c6e2 100644 --- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure_tree.js +++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure_tree.js @@ -16,6 +16,7 @@ frappe.treeview_settings["Quality Procedure"] = { }, ], breadcrumb: "Setup", + disable_add_node: true, root_label: "All Quality Procedures", get_tree_root: false, menu_items: [ diff --git a/erpnext/quality_management/doctype/quality_procedure_process/quality_procedure_process.json b/erpnext/quality_management/doctype/quality_procedure_process/quality_procedure_process.json index 0a67fa505ee..3925dbb8aca 100644 --- a/erpnext/quality_management/doctype/quality_procedure_process/quality_procedure_process.json +++ b/erpnext/quality_management/doctype/quality_procedure_process/quality_procedure_process.json @@ -1,6 +1,8 @@ { + "actions": [], "creation": "2019-05-26 00:10:00.248885", "doctype": "DocType", + "editable_grid": 1, "engine": "InnoDB", "field_order": [ "process_description", @@ -23,7 +25,8 @@ } ], "istable": 1, - "modified": "2019-05-26 22:05:49.007189", + "links": [], + "modified": "2020-06-17 15:44:38.937915", "modified_by": "Administrator", "module": "Quality Management", "name": "Quality Procedure Process", From b9c38a13d19f6c7c25234a45ececca3bf1b4f4f2 Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 17 Jun 2020 18:14:47 +0530 Subject: [PATCH 21/66] chore: Remove unnecessary get_doc --- .../doctype/quality_procedure/quality_procedure.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py index ea544f67339..1952e578673 100644 --- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py +++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py @@ -46,9 +46,7 @@ class QualityProcedure(NestedSet): # Set parent for only those children who don't have a parent parent_quality_procedure = frappe.db.get_value("Quality Procedure", process.procedure, "parent_quality_procedure") if not parent_quality_procedure and process.procedure: - doc = frappe.get_doc("Quality Procedure", process.procedure) - doc.parent_quality_procedure = self.name - doc.save(ignore_permissions=True) + frappe.db.set_value(self.doctype, process.procedure, "parent_quality_procedure", self.name) def check_for_incorrect_child(self): for process in self.processes: From ea78b2403581303973b307abfe4fbedfc494fceb Mon Sep 17 00:00:00 2001 From: Afshan <33727827+AfshanKhan@users.noreply.github.com> Date: Thu, 18 Jun 2020 09:49:35 +0530 Subject: [PATCH 22/66] style: subtitle to be displayed if provided else empty (#22298) * added: /support * refactor code and implemented fail checks * removed unused imports * changed filter from from title to name * refactor code to move context inside main * removed unused variable * added: /support * refactor code and implemented fail checks * removed unused imports * changed filter from from title to name * refactor code to move context inside main * removed unused variable * refactor: renamed set to get * style: subtitle to be displyed if provided else empty Co-authored-by: Shivam Mishra Co-authored-by: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> --- erpnext/www/support/index.html | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/erpnext/www/support/index.html b/erpnext/www/support/index.html index 2b1c282d184..93da503dbb0 100644 --- a/erpnext/www/support/index.html +++ b/erpnext/www/support/index.html @@ -4,8 +4,10 @@
-

{{ greeting_title or _("We're here to help") }}

-

{{ greeting_subtitle or _("Browse help topics.") }}

+

{{ greeting_title or _("We're here to help!") }}

+ {% if greeting_subtitle %} +

{{ greeting_subtitle }}

+ {% endif %}
@@ -16,16 +18,17 @@

{{ _("Frequently Read Articles") }}

{% for favorite_article in favorite_article_list %} -
-
-
-
{{ favorite_article['category'] }}
-

{{ favorite_article['title'] }}

-

{{ favorite_article['description'] }}

-
- +
+
+
+
+ {{ favorite_article['category'] }}
+

{{ favorite_article['title'] }}

+

{{ favorite_article['description'] }}

+
+
{% endfor %}
From 755e7c812a8a9670b40b208b092d72a1d9fa7488 Mon Sep 17 00:00:00 2001 From: Chinmay Pai Date: Thu, 18 Jun 2020 10:05:53 +0530 Subject: [PATCH 23/66] chore: update travis url for docker build action (#22274) Signed-off-by: Chinmay D. Pai --- .github/workflows/docker-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index d36b11553ce..8f678583066 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -11,4 +11,4 @@ jobs: - name: curl run: | apk add curl bash - curl -s -X POST -H "Content-Type: application/json" -H "Accept: application/json" -H "Travis-API-Version: 3" -H "Authorization: token ${{ secrets.TRAVIS_CI_TOKEN }}" -d '{"request":{"branch":"master"}}' https://api.travis-ci.org/repo/frappe%2Ffrappe_docker/requests + curl -s -X POST -H "Content-Type: application/json" -H "Accept: application/json" -H "Travis-API-Version: 3" -H "Authorization: token ${{ secrets.TRAVIS_CI_TOKEN }}" -d '{"request":{"branch":"master"}}' https://api.travis-ci.com/repo/frappe%2Ffrappe_docker/requests From 24ee482d8fb1ab6ba7944205f48512487aba27f5 Mon Sep 17 00:00:00 2001 From: marination Date: Thu, 18 Jun 2020 11:46:47 +0530 Subject: [PATCH 24/66] fix: Codacy --- .../doctype/quality_procedure/quality_procedure.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.js b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.js index 357bd654a7c..cf2644e0053 100644 --- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.js +++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.js @@ -8,7 +8,7 @@ frappe.ui.form.on('Quality Procedure', { filters: { name: ["not in", [frm.parent_quality_procedure, frm.name]] } - } - }) + }; + }); } }); \ No newline at end of file From 96100e95077db9d9a2a27b384030460109cdd0f2 Mon Sep 17 00:00:00 2001 From: Chinmay Pai Date: Thu, 18 Jun 2020 11:58:54 +0530 Subject: [PATCH 25/66] chore: add standard queries hooks to whitelist (#21939) standard queries are used within the search widget, and now require to be whitelisted before they can be executed through the search widget. Signed-off-by: Chinmay D. Pai Co-authored-by: sahil28297 <37302950+sahil28297@users.noreply.github.com> --- .../doctype/healthcare_practitioner/healthcare_practitioner.py | 1 + erpnext/selling/doctype/customer/customer.py | 1 + 2 files changed, 2 insertions(+) diff --git a/erpnext/healthcare/doctype/healthcare_practitioner/healthcare_practitioner.py b/erpnext/healthcare/doctype/healthcare_practitioner/healthcare_practitioner.py index 0c13b6af9db..3dc7c1ec393 100644 --- a/erpnext/healthcare/doctype/healthcare_practitioner/healthcare_practitioner.py +++ b/erpnext/healthcare/doctype/healthcare_practitioner/healthcare_practitioner.py @@ -70,6 +70,7 @@ def validate_service_item(item, msg): if frappe.db.get_value('Item', item, 'is_stock_item'): frappe.throw(_(msg)) +@frappe.whitelist() def get_practitioner_list(doctype, txt, searchfield, start, page_len, filters=None): fields = ['name', 'practitioner_name', 'mobile_phone'] diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index ac3bc201e96..682dfede72f 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -339,6 +339,7 @@ def get_loyalty_programs(doc): return lp_details +@frappe.whitelist() def get_customer_list(doctype, txt, searchfield, start, page_len, filters=None): from erpnext.controllers.queries import get_fields From 8d5380a2f0a2e0a160e05092b872302d7d940894 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 18 Jun 2020 14:06:31 +0530 Subject: [PATCH 26/66] fix: incorrect variable used --- erpnext/controllers/accounts_controller.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 837ffe3c8cb..f54b593022c 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1197,11 +1197,11 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil action = "add" if perm_type == 'create' else "update" frappe.throw(_("You do not have permissions to {} items in a Sales Order.").format(action), title=_("Insufficient Permissions")) - def get_new_child_item(): + def get_new_child_item(item_row): if parent_doctype == "Sales Order": - return set_sales_order_defaults(parent_doctype, parent_doctype_name, child_docname, d) + return set_sales_order_defaults(parent_doctype, parent_doctype_name, child_docname, item_row) if parent_doctype == "Purchase Order": - return set_purchase_order_defaults(parent_doctype, parent_doctype_name, child_docname, d) + return set_purchase_order_defaults(parent_doctype, parent_doctype_name, child_docname, item_row) def validate_quantity(child_item, d): if parent_doctype == "Sales Order" and flt(d.get("qty")) < flt(child_item.delivered_qty): @@ -1222,7 +1222,7 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil if not d.get("docname"): new_child_flag = True check_permissions(parent, 'create') - child_item = get_new_child_item() + child_item = get_new_child_item(d) else: check_permissions(parent, 'write') child_item = frappe.get_doc(parent_doctype + ' Item', d.get("docname")) From bd449c8d0794e359bf64d5aff8e72e6e91ff3c59 Mon Sep 17 00:00:00 2001 From: Anupam K Date: Thu, 18 Jun 2020 14:20:22 +0530 Subject: [PATCH 27/66] email digest html fix --- erpnext/setup/doctype/email_digest/email_digest.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py index 4d2d540bbc8..7c0be3bff63 100644 --- a/erpnext/setup/doctype/email_digest/email_digest.py +++ b/erpnext/setup/doctype/email_digest/email_digest.py @@ -101,8 +101,7 @@ class EmailDigest(Document): if not context.purchase_order_list: frappe.throw(_("No items to be received are overdue")) - if not (context.events or context.todo_list or context.notifications or context.cards - or context.purchase_orders_items_overdue_list): + if not context: return None frappe.flags.ignore_account_permission = False From 95e9a4ef2cdb5551c2e6171cc43d75cf2de8ea37 Mon Sep 17 00:00:00 2001 From: marination Date: Thu, 18 Jun 2020 14:43:31 +0530 Subject: [PATCH 28/66] fix: Patch simplification - Also, apply patch to all docs --- erpnext/patches/v12_0/set_multi_uom_in_rfq.py | 21 ++++--------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/erpnext/patches/v12_0/set_multi_uom_in_rfq.py b/erpnext/patches/v12_0/set_multi_uom_in_rfq.py index 50725bb69dd..70ca6b222e9 100644 --- a/erpnext/patches/v12_0/set_multi_uom_in_rfq.py +++ b/erpnext/patches/v12_0/set_multi_uom_in_rfq.py @@ -9,21 +9,8 @@ from erpnext.stock.get_item_details import get_conversion_factor def execute(): frappe.reload_doc('buying', 'doctype', 'request_for_quotation_item') - for rfq_item in frappe.db.sql("""SELECT name, item_code, uom, qty FROM `tabRequest for Quotation Item` WHERE docstatus<2""", as_dict=1): - item_code, uom, qty = rfq_item.get("item_code"), rfq_item.get("uom"), rfq_item.get("qty") - conversion_factor = get_conversion_factor(item_code, uom).get("conversion_factor") or 1.0 - - filters = { - "name" : rfq_item.get("name"), - "stock_uom" : frappe.db.get_value("Item", item_code, "stock_uom"), - "conversion_factor" : conversion_factor, - "stock_qty" : flt(qty) * flt(conversion_factor) - } - - frappe.db.sql("""UPDATE `tabRequest for Quotation Item` + frappe.db.sql("""UPDATE `tabRequest for Quotation Item` SET - stock_uom= %(stock_uom)s, - conversion_factor = %(conversion_factor)s, - stock_qty = %(stock_qty)s - WHERE - name = %(name)s""", filters) \ No newline at end of file + stock_uom = uom, + conversion_factor = 1, + stock_qty = qty""") \ No newline at end of file From 34d2bfbb3e6ce28de2690812191b8885b4f8f6ab Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 18 Jun 2020 09:58:55 +0000 Subject: [PATCH 29/66] refactor: handle exceptions when updating addresses (#22307) * refactor: handle exceptions when updating addresses * refactor: fold common statements in a loop --- .../connectors/woocommerce_connection.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/erpnext/erpnext_integrations/connectors/woocommerce_connection.py b/erpnext/erpnext_integrations/connectors/woocommerce_connection.py index 1b0c9f60b6e..6dedaa8c530 100644 --- a/erpnext/erpnext_integrations/connectors/woocommerce_connection.py +++ b/erpnext/erpnext_integrations/connectors/woocommerce_connection.py @@ -73,10 +73,16 @@ def link_customer_and_address(raw_billing_data, raw_shipping_data, customer_name if customer_exists: frappe.rename_doc("Customer", old_name, customer_name) - billing_address = frappe.get_doc("Address", {"woocommerce_email": customer_woo_com_email, "address_type": "Billing"}) - shipping_address = frappe.get_doc("Address", {"woocommerce_email": customer_woo_com_email, "address_type": "Shipping"}) - rename_address(billing_address, customer) - rename_address(shipping_address, customer) + for address_type in ("Billing", "Shipping",): + try: + address = frappe.get_doc("Address", {"woocommerce_email": customer_woo_com_email, "address_type": address_type}) + rename_address(address, customer) + except ( + frappe.DoesNotExistError, + frappe.DuplicateEntryError, + frappe.ValidationError, + ): + pass else: create_address(raw_billing_data, customer, "Billing") create_address(raw_shipping_data, customer, "Shipping") From a529d71ca0bf7517dc9d76e1dfd52359b411b7a8 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Thu, 18 Jun 2020 15:38:43 +0530 Subject: [PATCH 30/66] fix(patch): add patch for setting issue metrics (#22296) * patch: set issue metrics in Issue documents * fix: commit after every 100 records --- erpnext/patches.txt | 1 + erpnext/patches/v13_0/update_issue_metrics.py | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 erpnext/patches/v13_0/update_issue_metrics.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 279c453e350..d74dc244f3a 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -699,3 +699,4 @@ erpnext.patches.v13_0.delete_old_purchase_reports erpnext.patches.v12_0.set_italian_import_supplier_invoice_permissions erpnext.patches.v13_0.update_sla_enhancements erpnext.patches.v12_0.update_address_template_for_india +erpnext.patches.v13_0.update_issue_metrics diff --git a/erpnext/patches/v13_0/update_issue_metrics.py b/erpnext/patches/v13_0/update_issue_metrics.py new file mode 100644 index 00000000000..6d7623565f0 --- /dev/null +++ b/erpnext/patches/v13_0/update_issue_metrics.py @@ -0,0 +1,33 @@ +from __future__ import unicode_literals +import frappe + +from frappe.core.doctype.communication.communication import set_avg_response_time +from erpnext.support.doctype.issue.issue import set_resolution_time, set_user_resolution_time + +def execute(): + if frappe.db.exists('DocType', 'Issue'): + frappe.reload_doctype('Issue') + + count = 0 + for parent in frappe.get_all('Issue', order_by='creation desc'): + parent_doc = frappe.get_doc('Issue', parent.name) + + communication = frappe.get_all('Communication', filters={ + 'reference_doctype': 'Issue', + 'reference_name': parent.name, + 'communication_medium': 'Email', + 'sent_or_received': 'Sent' + }, order_by = 'creation asc', limit=1) + + if communication: + communication_doc = frappe.get_doc('Communication', communication[0].name) + set_avg_response_time(parent_doc, communication_doc) + + if parent_doc.status in ['Closed', 'Resolved']: + set_resolution_time(parent_doc) + set_user_resolution_time(parent_doc) + + # commit after every 100 records + count += 1 + if count % 100 == 0: + frappe.db.commit() \ No newline at end of file From 1ba7708b602f295d19eae92445f0a33002f45bc4 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 18 Jun 2020 16:45:16 +0530 Subject: [PATCH 31/66] fix: Do not copy Item Tax template from SO to PO --- erpnext/selling/doctype/sales_order/sales_order.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 05e4aa892b0..ffb66354fa0 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -868,7 +868,8 @@ def make_purchase_order(source_name, for_supplier=None, selected_items=[], targe ], "field_no_map": [ "rate", - "price_list_rate" + "price_list_rate", + "item_tax_template" ], "postprocess": update_item, "condition": lambda doc: doc.ordered_qty < doc.qty and doc.supplier == supplier and doc.item_code in selected_items From 77673e27e07b55330ff12db4e0ab4b8e46e26cb5 Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Thu, 18 Jun 2020 17:46:20 +0530 Subject: [PATCH 32/66] enable Lead create by email (#22314) Co-authored-by: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> --- erpnext/crm/doctype/lead/lead.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/crm/doctype/lead/lead.json b/erpnext/crm/doctype/lead/lead.json index 6fef0c46437..f5f8b4efb34 100644 --- a/erpnext/crm/doctype/lead/lead.json +++ b/erpnext/crm/doctype/lead/lead.json @@ -6,6 +6,7 @@ "creation": "2013-04-10 11:45:37", "doctype": "DocType", "document_type": "Document", + "email_append_to": 1, "engine": "InnoDB", "field_order": [ "organization_lead", @@ -448,7 +449,7 @@ "idx": 5, "image_field": "image", "links": [], - "modified": "2020-05-11 20:27:45.868960", + "modified": "2020-06-18 14:39:41.835416", "modified_by": "Administrator", "module": "CRM", "name": "Lead", @@ -508,8 +509,10 @@ } ], "search_fields": "lead_name,lead_owner,status", + "sender_field": "email_id", "show_name_in_global_search": 1, "sort_field": "modified", "sort_order": "DESC", + "subject_field": "title", "title_field": "title" } \ No newline at end of file From 82ddef58c01f074f5846ab9115efe8237622b33a Mon Sep 17 00:00:00 2001 From: Prssanna Desai Date: Thu, 18 Jun 2020 18:18:41 +0530 Subject: [PATCH 33/66] feat: date filter for fiscal year (#21880) * feat: date filter for fiscal year * fix: rename fieldtypes to valid_for_fieldtypes * Update utils.py Co-authored-by: Nabin Hait --- erpnext/accounts/utils.py | 22 +++++++++++++++++++++- erpnext/hooks.py | 2 +- erpnext/startup/filters.py | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 erpnext/startup/filters.py diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 5165495786d..f6cd606757e 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -57,6 +57,9 @@ def get_fiscal_years(transaction_date=None, fiscal_year=None, label="Date", verb frappe.cache().hset("fiscal_years", company, fiscal_years) + if not transaction_date and not fiscal_year: + return fiscal_years + if transaction_date: transaction_date = getdate(transaction_date) @@ -79,6 +82,23 @@ def get_fiscal_years(transaction_date=None, fiscal_year=None, label="Date", verb if verbose==1: frappe.msgprint(error_msg) raise FiscalYearError(error_msg) +@frappe.whitelist() +def get_fiscal_year_filter_field(company=None): + field = { + "fieldtype": "Select", + "options": [], + "operator": "Between", + "query_value": True + } + fiscal_years = get_fiscal_years(company=company) + for fiscal_year in fiscal_years: + field["options"].append({ + "label": fiscal_year.name, + "value": fiscal_year.name, + "query_value": [fiscal_year.year_start_date.strftime("%Y-%m-%d"), fiscal_year.year_end_date.strftime("%Y-%m-%d")] + }) + return field + def validate_fiscal_year(date, fiscal_year, company, label="Date", doc=None): years = [f[0] for f in get_fiscal_years(date, label=_(label), company=company)] if fiscal_year not in years: @@ -942,4 +962,4 @@ def get_voucherwise_gl_entries(future_stock_vouchers, posting_date): tuple([posting_date] + [d[1] for d in future_stock_vouchers]), as_dict=1): gl_entries.setdefault((d.voucher_type, d.voucher_no), []).append(d) - return gl_entries \ No newline at end of file + return gl_entries diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 742cc8efbd1..2a695896ed0 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -41,7 +41,7 @@ boot_session = "erpnext.startup.boot.boot_session" notification_config = "erpnext.startup.notifications.get_notification_config" get_help_messages = "erpnext.utilities.activation.get_help_messages" leaderboards = "erpnext.startup.leaderboard.get_leaderboards" - +filters_config = "erpnext.startup.filters.get_filters_config" on_session_creation = [ "erpnext.portal.utils.create_customer_or_supplier", diff --git a/erpnext/startup/filters.py b/erpnext/startup/filters.py new file mode 100644 index 00000000000..a99e49b4917 --- /dev/null +++ b/erpnext/startup/filters.py @@ -0,0 +1,14 @@ + +import frappe + +def get_filters_config(): + filters_config = { + "fiscal year": { + "label": "Fiscal Year", + "get_field": "erpnext.accounts.utils.get_fiscal_year_filter_field", + "valid_for_fieldtypes": ["Date", "Datetime", "DateRange"], + "depends_on": "company", + } + } + + return filters_config \ No newline at end of file From d9b2d635d8c55acc7646c54cb4cb7fee8e125b49 Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Thu, 18 Jun 2020 19:13:01 +0530 Subject: [PATCH 34/66] feat: added Expense approver for employee and validation (#22244) * feat: added Expense approver for employee nad validation * fix: requested changes --- .../department_approver/department_approver.py | 16 +++++++++++++++- erpnext/hr/doctype/employee/employee.json | 11 ++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/doctype/department_approver/department_approver.py b/erpnext/hr/doctype/department_approver/department_approver.py index df0f75a18c3..d4c118f802d 100644 --- a/erpnext/hr/doctype/department_approver/department_approver.py +++ b/erpnext/hr/doctype/department_approver/department_approver.py @@ -19,7 +19,7 @@ def get_approvers(doctype, txt, searchfield, start, page_len, filters): approvers = [] department_details = {} department_list = [] - employee = frappe.get_value("Employee", filters.get("employee"), ["department", "leave_approver"], as_dict=True) + employee = frappe.get_value("Employee", filters.get("employee"), ["department", "leave_approver", "expense_approver"], as_dict=True) employee_department = filters.get("department") or employee.department if employee_department: @@ -33,10 +33,16 @@ def get_approvers(doctype, txt, searchfield, start, page_len, filters): if filters.get("doctype") == "Leave Application" and employee.leave_approver: approvers.append(frappe.db.get_value("User", employee.leave_approver, ['name', 'first_name', 'last_name'])) + if filters.get("doctype") == "Expense Claim" and employee.expense_approver: + approvers.append(frappe.db.get_value("User", employee.expense_approver, ['name', 'first_name', 'last_name'])) + + if filters.get("doctype") == "Leave Application": parentfield = "leave_approvers" + field_name = "Leave Approver" else: parentfield = "expense_approvers" + field_name = "Expense Approver" if department_list: for d in department_list: approvers += frappe.db.sql("""select user.name, user.first_name, user.last_name from @@ -46,4 +52,12 @@ def get_approvers(doctype, txt, searchfield, start, page_len, filters): and approver.parentfield = %s and approver.approver=user.name""",(d, "%" + txt + "%", parentfield), as_list=True) + if len(approvers) == 0: + frappe.throw(_("Please set {0} for the Employee or for Department: {1}"). + format( + field_name, frappe.bold(employee_department), + frappe.bold(employee.name) + ), + title=_(field_name + " Missing")) + return set(tuple(approver) for approver in approvers) diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index 2c2b2f6a17b..7dacacf12b0 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -62,6 +62,7 @@ "salary_mode", "payroll_cost_center", "column_break_52", + "expense_approver", "bank_name", "bank_ac_no", "health_insurance_section", @@ -798,13 +799,21 @@ { "fieldname": "column_break_52", "fieldtype": "Column Break" + }, + { + "fieldname": "expense_approver", + "fieldtype": "Link", + "label": "Expense Approver", + "options": "User", + "show_days": 1, + "show_seconds": 1 } ], "icon": "fa fa-user", "idx": 24, "image_field": "image", "links": [], - "modified": "2020-06-15 12:26:30.003741", + "modified": "2020-06-18 18:01:27.223535", "modified_by": "Administrator", "module": "HR", "name": "Employee", From 25702a1c550069845d8ce1fea5aade1770ca7c64 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 18 Jun 2020 19:49:46 +0530 Subject: [PATCH 35/66] refactor: show service instead of services --- .../templates/includes/footer/footer_powered.html | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/erpnext/templates/includes/footer/footer_powered.html b/erpnext/templates/includes/footer/footer_powered.html index cf7661ee3fa..4274ba12cf5 100644 --- a/erpnext/templates/includes/footer/footer_powered.html +++ b/erpnext/templates/includes/footer/footer_powered.html @@ -10,9 +10,17 @@ 'Agriculture': '/agriculture', 'Hospitality': '' } %} + {% set link = '' %} +{% set label = domains[0].domain %} {% if domains %} - {% set link = links[domains[0].domain] %} + {% set link = links[label] %} {% endif %} -Powered by ERPNext - {{ '' if domains else 'Open Source' }} ERP Software {{ ('for ' + domains[0].domain + ' Companies') if domains else '' }} +{% if label == "Services" %} + {% set label = "Service" %} +{% endif %} + + + +Powered by ERPNext - {{ '' if domains else 'Open Source' }} ERP Software {{ ('for ' + label + ' Companies') if domains else '' }} From 766f978858b2929ae2caa6a80596b76b850e13fe Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Thu, 18 Jun 2020 23:23:54 +0530 Subject: [PATCH 36/66] fix: Customer Group label in Itemwise Sales report --- .../report/item_wise_sales_history/item_wise_sales_history.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py index 405004ece54..08a98ba6c07 100644 --- a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py +++ b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py @@ -96,7 +96,7 @@ def get_columns(filters): "label": _("Customer Group"), "fieldtype": "Link", "fieldname": "customer_group", - "options": "customer Group", + "options": "Customer Group", "width": 120 }, { From a9cdc7b6966739bb1771685910bc8a184203beab Mon Sep 17 00:00:00 2001 From: Afshan <33727827+AfshanKhan@users.noreply.github.com> Date: Fri, 19 Jun 2020 11:11:33 +0530 Subject: [PATCH 37/66] style: moved project from reference section to accounting dimensions section (#22309) --- .../doctype/journal_entry_account/journal_entry_account.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json index 26c84a6398c..ff3533a6792 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -18,6 +18,7 @@ "accounting_dimensions_section", "cost_center", "dimension_col_break", + "project", "currency_section", "account_currency", "column_break_10", @@ -32,7 +33,6 @@ "reference_type", "reference_name", "reference_due_date", - "project", "col_break3", "is_advance", "user_remark", @@ -273,7 +273,7 @@ "idx": 1, "istable": 1, "links": [], - "modified": "2020-04-25 01:47:49.060128", + "modified": "2020-06-18 14:06:54.833738", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", From 428235c478a1dcb0a90a864e9d7dae9d849ff71b Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Fri, 19 Jun 2020 11:15:59 +0530 Subject: [PATCH 38/66] fix: revert issue metrics patch (#22331) --- erpnext/patches.txt | 1 - erpnext/patches/v13_0/update_issue_metrics.py | 33 ------------------- 2 files changed, 34 deletions(-) delete mode 100644 erpnext/patches/v13_0/update_issue_metrics.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index e897260da2c..b3a38b61943 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -700,4 +700,3 @@ erpnext.patches.v12_0.set_italian_import_supplier_invoice_permissions erpnext.patches.v13_0.update_sla_enhancements erpnext.patches.v12_0.update_address_template_for_india erpnext.patches.v12_0.set_multi_uom_in_rfq -erpnext.patches.v13_0.update_issue_metrics diff --git a/erpnext/patches/v13_0/update_issue_metrics.py b/erpnext/patches/v13_0/update_issue_metrics.py deleted file mode 100644 index 6d7623565f0..00000000000 --- a/erpnext/patches/v13_0/update_issue_metrics.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import unicode_literals -import frappe - -from frappe.core.doctype.communication.communication import set_avg_response_time -from erpnext.support.doctype.issue.issue import set_resolution_time, set_user_resolution_time - -def execute(): - if frappe.db.exists('DocType', 'Issue'): - frappe.reload_doctype('Issue') - - count = 0 - for parent in frappe.get_all('Issue', order_by='creation desc'): - parent_doc = frappe.get_doc('Issue', parent.name) - - communication = frappe.get_all('Communication', filters={ - 'reference_doctype': 'Issue', - 'reference_name': parent.name, - 'communication_medium': 'Email', - 'sent_or_received': 'Sent' - }, order_by = 'creation asc', limit=1) - - if communication: - communication_doc = frappe.get_doc('Communication', communication[0].name) - set_avg_response_time(parent_doc, communication_doc) - - if parent_doc.status in ['Closed', 'Resolved']: - set_resolution_time(parent_doc) - set_user_resolution_time(parent_doc) - - # commit after every 100 records - count += 1 - if count % 100 == 0: - frappe.db.commit() \ No newline at end of file From 163a569715c56b23e2001c61b67da34cac973124 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Fri, 19 Jun 2020 12:03:36 +0530 Subject: [PATCH 39/66] chore: Delete Bank Reco doctype --- erpnext/patches.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index b3a38b61943..15c4080f976 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -700,3 +700,4 @@ erpnext.patches.v12_0.set_italian_import_supplier_invoice_permissions erpnext.patches.v13_0.update_sla_enhancements erpnext.patches.v12_0.update_address_template_for_india erpnext.patches.v12_0.set_multi_uom_in_rfq +execute:frappe.delete_doc_if_exists("DocType", "Bank Reconciliation") From 7a45c8bc28b286e73c349d82a268758b2c0f75f5 Mon Sep 17 00:00:00 2001 From: Afshan Date: Fri, 19 Jun 2020 12:37:50 +0530 Subject: [PATCH 40/66] fix: replaced "row_id" to "idx" as "row_id" was not available in variable "tax", also replaced "-1" by "-2" as "idx" starts with 0 rather than 1 --- erpnext/public/js/controllers/taxes_and_totals.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index dbe48ec6544..a6eb901fa72 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -345,11 +345,11 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ current_tax_amount = (tax_rate / 100.0) * item.net_amount; } else if(tax.charge_type == "On Previous Row Amount") { current_tax_amount = (tax_rate / 100.0) * - this.frm.doc["taxes"][cint(tax.row_id) - 1].tax_amount_for_current_item; + this.frm.doc["taxes"][cint(tax.idx) - 2].tax_amount_for_current_item; } else if(tax.charge_type == "On Previous Row Total") { current_tax_amount = (tax_rate / 100.0) * - this.frm.doc["taxes"][cint(tax.row_id) - 1].grand_total_for_current_item; + this.frm.doc["taxes"][cint(tax.idx) - 2].grand_total_for_current_item; } this.set_item_wise_tax(item, tax, tax_rate, current_tax_amount); From 6f7652f425e2e58f7059d43c9bf7373af67cac3a Mon Sep 17 00:00:00 2001 From: Afshan Date: Fri, 19 Jun 2020 14:36:56 +0530 Subject: [PATCH 41/66] fix: set row_id by default as previous row for On Previous Row Amount and On Previous Row Total --- erpnext/public/js/controllers/taxes_and_totals.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index a6eb901fa72..6b8dc2804f3 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -335,6 +335,17 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ var tax_rate = this._get_tax_rate(tax, item_tax_map); var current_tax_amount = 0.0; + // To set row_id by default as previous row. + if(["On Previous Row Amount", "On Previous Row Total"].includes(tax.charge_type)) { + if (tax.idx == 1) { + frappe.throw( + __("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row")) + } + if (!tax.row_id) { + tax.row_id = tax.idx - 1; + } + } + if(tax.charge_type == "Actual") { // distribute the tax amount proportionally to each item row var actual = flt(tax.tax_amount, precision("tax_amount", tax)); @@ -345,11 +356,11 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ current_tax_amount = (tax_rate / 100.0) * item.net_amount; } else if(tax.charge_type == "On Previous Row Amount") { current_tax_amount = (tax_rate / 100.0) * - this.frm.doc["taxes"][cint(tax.idx) - 2].tax_amount_for_current_item; + this.frm.doc["taxes"][cint(tax.row_id) - 1].tax_amount_for_current_item; } else if(tax.charge_type == "On Previous Row Total") { current_tax_amount = (tax_rate / 100.0) * - this.frm.doc["taxes"][cint(tax.idx) - 2].grand_total_for_current_item; + this.frm.doc["taxes"][cint(tax.row_id) - 1].grand_total_for_current_item; } this.set_item_wise_tax(item, tax, tax_rate, current_tax_amount); From 0fe14ce94e1cace40c0a7186ad6a6a837d89143c Mon Sep 17 00:00:00 2001 From: Afshan Date: Fri, 19 Jun 2020 15:10:15 +0530 Subject: [PATCH 42/66] style: formate according to Codacy/PR Quality Review --- erpnext/public/js/controllers/taxes_and_totals.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 6b8dc2804f3..a449bdcca67 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -337,9 +337,9 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ // To set row_id by default as previous row. if(["On Previous Row Amount", "On Previous Row Total"].includes(tax.charge_type)) { - if (tax.idx == 1) { - frappe.throw( - __("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row")) + if (tax.idx === 1) { + frappe.throw( + __("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row")); } if (!tax.row_id) { tax.row_id = tax.idx - 1; From 383807f72e8938b3812e1254f8e82a0609b65903 Mon Sep 17 00:00:00 2001 From: Marica Date: Fri, 19 Jun 2020 15:33:21 +0530 Subject: [PATCH 43/66] feat: Selling Desk, Dashboard and Onboarding (#22055) * feat: Selling Desk, Dashboard and Onboarding * chore: Selling Onboarding and fixes in Other onboardings * chore: Dashboard and Number card Fixtures * fix: Escape filters and Reposition Accounts Dashboard shortcut. Co-authored-by: Nabin Hait --- .../desk_page/accounting/accounting.json | 14 +- .../ordered_items_to_be_billed.js | 8 - .../ordered_items_to_be_billed.json | 27 -- .../ordered_items_to_be_billed.py | 26 -- erpnext/buying/dashboard_fixtures.py | 3 +- .../buying_settings/buying_settings.js | 8 +- .../module_onboarding/buying/buying.json | 2 +- .../buying_settings/buying_settings.json | 10 +- erpnext/patches.txt | 3 +- .../patches/v13_0/delete_old_sales_reports.py | 21 ++ erpnext/selling/dashboard_fixtures.py | 198 +++++++++++++ .../selling/desk_page/selling/selling.json | 70 +++-- .../selling_settings/selling_settings.js | 23 ++ .../selling_settings/selling_settings.json | 8 +- .../module_onboarding/selling/selling.json | 54 ++++ .../create_a_customer/create_a_customer.json | 19 ++ .../create_a_product/create_a_product.json | 19 ++ .../create_a_quotation.json | 19 ++ .../create_product/create_product.json | 19 ++ .../create_your_first_sales_order.json | 19 ++ .../introduction_to_selling.json | 19 ++ .../selling_settings/selling_settings.json | 19 ++ .../setup_your_warehouse.json | 20 ++ .../item_wise_sales_history.js | 40 ++- .../item_wise_sales_history.py | 42 ++- .../quotation_trends/quotation_trends.py | 47 ++- .../report/sales_order_analysis}/__init__.py | 0 .../sales_order_analysis.js | 85 ++++++ .../sales_order_analysis.json | 36 +++ .../sales_order_analysis.py | 279 ++++++++++++++++++ .../sales_order_trends/sales_order_trends.py | 47 ++- erpnext/stock/desk_page/stock/stock.json | 4 +- .../doctype/stock_settings/stock_settings.js | 2 +- .../delivery_note_trends.py | 3 +- .../ordered_items_to_be_delivered/__init__.py | 0 .../ordered_items_to_be_delivered.json | 34 --- 36 files changed, 1079 insertions(+), 168 deletions(-) delete mode 100644 erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.js delete mode 100644 erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.json delete mode 100644 erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.py create mode 100644 erpnext/patches/v13_0/delete_old_sales_reports.py create mode 100644 erpnext/selling/dashboard_fixtures.py create mode 100644 erpnext/selling/module_onboarding/selling/selling.json create mode 100644 erpnext/selling/onboarding_step/create_a_customer/create_a_customer.json create mode 100644 erpnext/selling/onboarding_step/create_a_product/create_a_product.json create mode 100644 erpnext/selling/onboarding_step/create_a_quotation/create_a_quotation.json create mode 100644 erpnext/selling/onboarding_step/create_product/create_product.json create mode 100644 erpnext/selling/onboarding_step/create_your_first_sales_order/create_your_first_sales_order.json create mode 100644 erpnext/selling/onboarding_step/introduction_to_selling/introduction_to_selling.json create mode 100644 erpnext/selling/onboarding_step/selling_settings/selling_settings.json create mode 100644 erpnext/selling/onboarding_step/setup_your_warehouse/setup_your_warehouse.json rename erpnext/{accounts/report/ordered_items_to_be_billed => selling/report/sales_order_analysis}/__init__.py (100%) create mode 100644 erpnext/selling/report/sales_order_analysis/sales_order_analysis.js create mode 100644 erpnext/selling/report/sales_order_analysis/sales_order_analysis.json create mode 100644 erpnext/selling/report/sales_order_analysis/sales_order_analysis.py delete mode 100644 erpnext/stock/report/ordered_items_to_be_delivered/__init__.py delete mode 100644 erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json diff --git a/erpnext/accounts/desk_page/accounting/accounting.json b/erpnext/accounts/desk_page/accounting/accounting.json index 42fb9f4f37d..31315e4c710 100644 --- a/erpnext/accounts/desk_page/accounting/accounting.json +++ b/erpnext/accounts/desk_page/accounting/accounting.json @@ -13,7 +13,7 @@ { "hidden": 0, "label": "Accounts Receivable", - "links": "[\n {\n \"description\": \"Bills raised to Customers.\",\n \"label\": \"Sales Invoice\",\n \"name\": \"Sales Invoice\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Customer database.\",\n \"label\": \"Customer\",\n \"name\": \"Customer\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Bank/Cash transactions against party or for internal transfer\",\n \"label\": \"Payment Entry\",\n \"name\": \"Payment Entry\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Payment Request\",\n \"label\": \"Payment Request\",\n \"name\": \"Payment Request\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Invoice\",\n \"is_query_report\": true,\n \"label\": \"Accounts Receivable\",\n \"name\": \"Accounts Receivable\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Invoice\",\n \"is_query_report\": true,\n \"label\": \"Accounts Receivable Summary\",\n \"name\": \"Accounts Receivable Summary\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Invoice\",\n \"is_query_report\": true,\n \"label\": \"Sales Register\",\n \"name\": \"Sales Register\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Invoice\",\n \"is_query_report\": true,\n \"label\": \"Item-wise Sales Register\",\n \"name\": \"Item-wise Sales Register\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Invoice\",\n \"is_query_report\": true,\n \"label\": \"Ordered Items To Be Billed\",\n \"name\": \"Ordered Items To Be Billed\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Invoice\",\n \"is_query_report\": true,\n \"label\": \"Delivered Items To Be Billed\",\n \"name\": \"Delivered Items To Be Billed\",\n \"type\": \"report\"\n }\n]" + "links": "[\n {\n \"description\": \"Bills raised to Customers.\",\n \"label\": \"Sales Invoice\",\n \"name\": \"Sales Invoice\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Customer database.\",\n \"label\": \"Customer\",\n \"name\": \"Customer\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Bank/Cash transactions against party or for internal transfer\",\n \"label\": \"Payment Entry\",\n \"name\": \"Payment Entry\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Payment Request\",\n \"label\": \"Payment Request\",\n \"name\": \"Payment Request\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Invoice\",\n \"is_query_report\": true,\n \"label\": \"Accounts Receivable\",\n \"name\": \"Accounts Receivable\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Invoice\",\n \"is_query_report\": true,\n \"label\": \"Accounts Receivable Summary\",\n \"name\": \"Accounts Receivable Summary\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Invoice\",\n \"is_query_report\": true,\n \"label\": \"Sales Register\",\n \"name\": \"Sales Register\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Invoice\",\n \"is_query_report\": true,\n \"label\": \"Item-wise Sales Register\",\n \"name\": \"Item-wise Sales Register\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Order Analysis\",\n \"name\": \"Sales Order Analysis\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Invoice\"\n ],\n \"doctype\": \"Sales Invoice\",\n \"is_query_report\": true,\n \"label\": \"Delivered Items To Be Billed\",\n \"name\": \"Delivered Items To Be Billed\",\n \"type\": \"report\"\n }\n]" }, { "hidden": 0, @@ -98,7 +98,7 @@ "idx": 0, "is_standard": 1, "label": "Accounting", - "modified": "2020-05-27 20:34:50.949772", + "modified": "2020-06-19 12:42:44.054598", "modified_by": "Administrator", "module": "Accounts", "name": "Accounting", @@ -122,11 +122,6 @@ "link_to": "Purchase Invoice", "type": "DocType" }, - { - "label": "Dashboard", - "link_to": "Accounts", - "type": "Dashboard" - }, { "label": "Journal Entry", "link_to": "Journal Entry", @@ -151,6 +146,11 @@ "label": "Trial Balance", "link_to": "Trial Balance", "type": "Report" + }, + { + "label": "Dashboard", + "link_to": "Accounts", + "type": "Dashboard" } ] } \ No newline at end of file diff --git a/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.js b/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.js deleted file mode 100644 index 6e13d677666..00000000000 --- a/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.query_reports["Ordered Items To Be Billed"] = { - "filters": [ - - ] -} diff --git a/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.json b/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.json deleted file mode 100644 index c983dc96295..00000000000 --- a/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "add_total_row": 1, - "apply_user_permissions": 1, - "creation": "2013-02-21 14:26:44", - "disabled": 0, - "docstatus": 0, - "doctype": "Report", - "idx": 3, - "is_standard": "Yes", - "modified": "2017-11-06 13:04:51.559061", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Ordered Items To Be Billed", - "owner": "Administrator", - "query": "select \n `tabSales Order`.`name` as \"Sales Order:Link/Sales Order:120\",\n `tabSales Order`.`customer` as \"Customer:Link/Customer:120\",\n `tabSales Order`.`customer_name` as \"Customer Name:150\",\n`tabSales Order`.`status` as \"Status\",\n `tabSales Order`.`transaction_date` as \"Date:Date\",\n `tabSales Order`.`project` as \"Project\",\n `tabSales Order Item`.item_code as \"Item:Link/Item:120\",\n `tabSales Order Item`.base_amount as \"Amount:Currency:110\",\n (`tabSales Order Item`.billed_amt * ifnull(`tabSales Order`.conversion_rate, 1)) as \"Billed Amount:Currency:110\",\n (`tabSales Order Item`.base_amount - (`tabSales Order Item`.billed_amt * ifnull(`tabSales Order`.conversion_rate, 1))) as \"Pending Amount:Currency:120\",\n `tabSales Order Item`.item_name as \"Item Name::150\",\n `tabSales Order Item`.description as \"Description::200\",\n `tabSales Order`.`company` as \"Company:Link/Company:\"\nfrom\n `tabSales Order`, `tabSales Order Item`\nwhere\n `tabSales Order Item`.`parent` = `tabSales Order`.`name`\n and `tabSales Order`.docstatus = 1\n and `tabSales Order`.status != \"Closed\"\n and `tabSales Order Item`.amount > 0\n and `tabSales Order Item`.billed_amt < `tabSales Order Item`.amount\norder by `tabSales Order`.transaction_date asc", - "ref_doctype": "Sales Invoice", - "report_name": "Ordered Items To Be Billed", - "report_type": "Script Report", - "roles": [ - { - "role": "Accounts Manager" - }, - { - "role": "Accounts User" - } - ] -} \ No newline at end of file diff --git a/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.py b/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.py deleted file mode 100644 index ec0d2f39f35..00000000000 --- a/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe import _ -from erpnext.accounts.report.non_billed_report import get_ordered_to_be_billed_data - -def execute(filters=None): - columns = get_column() - args = get_args() - data = get_ordered_to_be_billed_data(args) - return columns, data - -def get_column(): - return [ - _("Sales Order") + ":Link/Sales Order:120", _("Status") + "::120", _("Date") + ":Date:100", - _("Suplier") + ":Link/Customer:120", _("Customer Name") + "::120", - _("Project") + ":Link/Project:120", _("Item Code") + ":Link/Item:120", - _("Amount") + ":Currency:100", _("Billed Amount") + ":Currency:100", _("Pending Amount") + ":Currency:100", - _("Item Name") + "::120", _("Description") + "::120", _("Company") + ":Link/Company:120", - ] - -def get_args(): - return {'doctype': 'Sales Order', 'party': 'customer', - 'date': 'transaction_date', 'order': 'transaction_date', 'order_by': 'asc'} \ No newline at end of file diff --git a/erpnext/buying/dashboard_fixtures.py b/erpnext/buying/dashboard_fixtures.py index 172c936bd2b..c6e2ffa634f 100644 --- a/erpnext/buying/dashboard_fixtures.py +++ b/erpnext/buying/dashboard_fixtures.py @@ -155,8 +155,7 @@ def get_number_cards(company, fiscal_year_name, start_date, end_date): ["Purchase Order", "transaction_date", "Between", [start_date, end_date], False], ["Purchase Order", "status", "not in", ["Draft", "Cancelled", "Closed", None], False], ["Purchase Order", "docstatus", "=", 1, False], - ["Purchase Order", "company", "=", company.name, False], - ["Purchase Order", "transaction_date", "Between", [start_date,end_date], False] + ["Purchase Order", "company", "=", company.name, False] ]), "function": "Sum", "is_public": 1, diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.js b/erpnext/buying/doctype/buying_settings/buying_settings.js index 01b40cd26fe..e496e9628d1 100644 --- a/erpnext/buying/doctype/buying_settings/buying_settings.js +++ b/erpnext/buying/doctype/buying_settings/buying_settings.js @@ -11,21 +11,21 @@ frappe.tour['Buying Settings'] = [ { fieldname: "supp_master_name", title: "Supplier Naming By", - description: __("By default, the Item Name is set as per the Item Code entered. If you want Items to be named by a set ") + "Naming Series" + __(" choose the 'Naming Series' option."), + description: __("By default, the Supplier Name is set as per the Supplier Name entered. If you want Suppliers to be named by a ") + "Naming Series" + __(" choose the 'Naming Series' option."), }, { fieldname: "buying_price_list", title: "Default Buying Price List", - description: __("Configure the default Price List when creating a new Buying transaction, the default is set as 'Standard Buying'. Item prices will be fetched from this Price List.") + description: __("Configure the default Price List when creating a new Purchase transaction. Item prices will be fetched from this Price List.") }, { fieldname: "po_required", title: "Purchase Order Required for Purchase Invoice & Receipt Creation", - description: __("If this option is configured 'Yes', ERPNext will prevent you from creating a Purchase Invoice or Receipt without creating a Purchase Order first. This configuration can be overridden for a particular supplier by enabling the 'Allow Purchase Invoice Creation Without Purchase Order' checkbox in supplier master.") + description: __("If this option is configured 'Yes', ERPNext will prevent you from creating a Purchase Invoice or Receipt without creating a Purchase Order first. This configuration can be overridden for a particular supplier by enabling the 'Allow Purchase Invoice Creation Without Purchase Order' checkbox in the Supplier master.") }, { fieldname: "pr_required", title: "Purchase Receipt Required for Purchase Invoice Creation", - description: __("If this option is configured 'Yes', ERPNext will prevent you from creating a Purchase Invoice without creating a Purchase Receipt first. This configuration can be overridden for a particular supplier by enabling the 'Allow Purchase Invoice Creation Without Purchase Receipt' checkbox in supplier master.") + description: __("If this option is configured 'Yes', ERPNext will prevent you from creating a Purchase Invoice without creating a Purchase Receipt first. This configuration can be overridden for a particular supplier by enabling the 'Allow Purchase Invoice Creation Without Purchase Receipt' checkbox in the Supplier master.") } ]; \ No newline at end of file diff --git a/erpnext/buying/module_onboarding/buying/buying.json b/erpnext/buying/module_onboarding/buying/buying.json index 8fe2f388b0c..6e4bbc95a24 100644 --- a/erpnext/buying/module_onboarding/buying/buying.json +++ b/erpnext/buying/module_onboarding/buying/buying.json @@ -19,7 +19,7 @@ "documentation_url": "https://docs.erpnext.com/docs/user/manual/en/buying", "idx": 0, "is_complete": 0, - "modified": "2020-05-27 17:17:52.075947", + "modified": "2020-06-01 12:55:09.234944", "modified_by": "Administrator", "module": "Buying", "name": "Buying", diff --git a/erpnext/buying/onboarding_step/buying_settings/buying_settings.json b/erpnext/buying/onboarding_step/buying_settings/buying_settings.json index a788ccd4cc9..6d765af1373 100644 --- a/erpnext/buying/onboarding_step/buying_settings/buying_settings.json +++ b/erpnext/buying/onboarding_step/buying_settings/buying_settings.json @@ -1,19 +1,19 @@ { - "action": "Update Settings", + "action": "Show Form Tour", "creation": "2020-05-06 15:53:44.667414", "docstatus": 0, "doctype": "Onboarding Step", "idx": 0, "is_complete": 0, - "is_mandatory": 0, - "is_single": 0, + "is_mandatory": 1, + "is_single": 1, "is_skipped": 0, - "modified": "2020-05-12 18:30:06.323797", + "modified": "2020-06-01 12:52:57.668870", "modified_by": "Administrator", "name": "Buying Settings", "owner": "Administrator", "reference_document": "Buying Settings", "show_full_form": 0, "title": "Configure Buying Settings.", - "validate_action": 1 + "validate_action": 0 } \ No newline at end of file diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 15c4080f976..a7395a476a6 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -700,4 +700,5 @@ erpnext.patches.v12_0.set_italian_import_supplier_invoice_permissions erpnext.patches.v13_0.update_sla_enhancements erpnext.patches.v12_0.update_address_template_for_india erpnext.patches.v12_0.set_multi_uom_in_rfq -execute:frappe.delete_doc_if_exists("DocType", "Bank Reconciliation") +erpnext.patches.v13_0.delete_old_sales_reports +execute:frappe.delete_doc_if_exists("DocType", "Bank Reconciliation") \ No newline at end of file diff --git a/erpnext/patches/v13_0/delete_old_sales_reports.py b/erpnext/patches/v13_0/delete_old_sales_reports.py new file mode 100644 index 00000000000..0f44865808a --- /dev/null +++ b/erpnext/patches/v13_0/delete_old_sales_reports.py @@ -0,0 +1,21 @@ +# Copyright (c) 2019, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals + +import frappe + +def execute(): + reports_to_delete = ["Ordered Items To Be Delivered", "Ordered Items To Be Billed"] + + for report in reports_to_delete: + if frappe.db.exists("Report", report): + delete_auto_email_reports(report) + + frappe.delete_doc("Report", report) + +def delete_auto_email_reports(report): + """ Check for one or multiple Auto Email Reports and delete """ + auto_email_reports = frappe.db.get_values("Auto Email Report", {"report": report}, ["name"]) + for auto_email_report in auto_email_reports: + frappe.delete_doc("Auto Email Report", auto_email_report[0]) \ No newline at end of file diff --git a/erpnext/selling/dashboard_fixtures.py b/erpnext/selling/dashboard_fixtures.py new file mode 100644 index 00000000000..889cb88dce1 --- /dev/null +++ b/erpnext/selling/dashboard_fixtures.py @@ -0,0 +1,198 @@ +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +import frappe +import json +from frappe import _ +from frappe.utils import nowdate +from erpnext.accounts.utils import get_fiscal_year + +def get_data(): + return frappe._dict({ + "dashboards": get_dashboards(), + "charts": get_charts(), + "number_cards": get_number_cards(), + }) + +def get_company_for_dashboards(): + company = frappe.defaults.get_defaults().company + if company: + return company + else: + company_list = frappe.get_list("Company") + if company_list: + return company_list[0].name + return None + +company = frappe.get_doc("Company", get_company_for_dashboards()) +fiscal_year = get_fiscal_year(nowdate(), as_dict=1) +fiscal_year_name = fiscal_year.get("name") +start_date = str(fiscal_year.get("year_start_date")) +end_date = str(fiscal_year.get("year_end_date")) + +def get_dashboards(): + return [{ + "name": "Selling", + "dashboard_name": "Selling", + "charts": [ + { "chart": "Sales Order Trends", "width": "Full"}, + { "chart": "Top Customers", "width": "Half"}, + { "chart": "Sales Order Analysis", "width": "Half"}, + { "chart": "Item-wise Annual Sales", "width": "Full"} + ], + "cards": [ + { "card": "Annual Sales"}, + { "card": "Sales Orders to Deliver"}, + { "card": "Sales Orders to Bill"}, + { "card": "Active Customers"} + ] + }] + +def get_charts(): + return [ + { + "name": "Sales Order Analysis", + "chart_name": _("Sales Order Analysis"), + "chart_type": "Report", + "custom_options": json.dumps({ + "type": "donut", + "height": 300, + "axisOptions": {"shortenYAxisNumbers": 1} + }), + "doctype": "Dashboard Chart", + "filters_json": json.dumps({ + "company": company.name, + "from_date": start_date, + "to_date": end_date + }), + "is_custom": 1, + "is_public": 1, + "owner": "Administrator", + "report_name": "Sales Order Analysis", + "type": "Donut" + }, + { + "name": "Item-wise Annual Sales", + "chart_name": _("Item-wise Annual Sales"), + "chart_type": "Report", + "doctype": "Dashboard Chart", + "filters_json": json.dumps({ + "company": company.name, + "from_date": start_date, + "to_date": end_date + }), + "is_custom": 1, + "is_public": 1, + "owner": "Administrator", + "report_name": "Item-wise Sales History", + "type": "Bar" + }, + { + "name": "Sales Order Trends", + "chart_name": _("Sales Order Trends"), + "chart_type": "Report", + "custom_options": json.dumps({ + "type": "line", + "axisOptions": {"shortenYAxisNumbers": 1}, + "tooltipOptions": {}, + "lineOptions": { + "regionFill": 1 + } + }), + "doctype": "Dashboard Chart", + "filters_json": json.dumps({ + "company": company.name, + "period": "Monthly", + "fiscal_year": fiscal_year_name, + "based_on": "Item" + }), + "is_custom": 1, + "is_public": 1, + "owner": "Administrator", + "report_name": "Sales Order Trends", + "type": "Line" + }, + { + "name": "Top Customers", + "chart_name": _("Top Customers"), + "chart_type": "Report", + "doctype": "Dashboard Chart", + "filters_json": json.dumps({ + "company": company.name, + "period": "Monthly", + "fiscal_year": fiscal_year_name, + "based_on": "Customer" + }), + "is_custom": 1, + "is_public": 1, + "owner": "Administrator", + "report_name": "Delivery Note Trends", + "type": "Bar" + } + ] + +def get_number_cards(): + return [ + { + "name": "Annual Sales", + "aggregate_function_based_on": "base_net_total", + "doctype": "Number Card", + "document_type": "Sales Order", + "filters_json": json.dumps([ + ["Sales Order", "transaction_date", "Between", [start_date, end_date], False], + ["Sales Order", "status", "not in", ["Draft", "Cancelled", "Closed", None], False], + ["Sales Order", "docstatus", "=", 1, False], + ["Sales Order", "company", "=", company.name, False] + ]), + "function": "Sum", + "is_public": 1, + "label": _("Annual Sales"), + "owner": "Administrator", + "show_percentage_stats": 1, + "stats_time_interval": "Monthly" + }, + { + "name": "Sales Orders to Deliver", + "doctype": "Number Card", + "document_type": "Sales Order", + "filters_json": json.dumps([ + ["Sales Order", "status", "in", ["To Deliver and Bill", "To Deliver", None], False], + ["Sales Order", "docstatus", "=", 1, False], + ["Sales Order", "company", "=", company.name, False] + ]), + "function": "Count", + "is_public": 1, + "label": _("Sales Orders to Deliver"), + "owner": "Administrator", + "show_percentage_stats": 1, + "stats_time_interval": "Weekly" + }, + { + "name": "Sales Orders to Bill", + "doctype": "Number Card", + "document_type": "Sales Order", + "filters_json": json.dumps([ + ["Sales Order", "status", "in", ["To Deliver and Bill", "To Bill", None], False], + ["Sales Order", "docstatus", "=", 1, False], + ["Sales Order", "company", "=", company.name, False] + ]), + "function": "Count", + "is_public": 1, + "label": _("Sales Orders to Bill"), + "owner": "Administrator", + "show_percentage_stats": 1, + "stats_time_interval": "Weekly" + }, + { + "name": "Active Customers", + "doctype": "Number Card", + "document_type": "Customer", + "filters_json": json.dumps([["Customer", "disabled", "=", "0"]]), + "function": "Count", + "is_public": 1, + "label": "Active Customers", + "owner": "Administrator", + "show_percentage_stats": 1, + "stats_time_interval": "Monthly" + } + ] \ No newline at end of file diff --git a/erpnext/selling/desk_page/selling/selling.json b/erpnext/selling/desk_page/selling/selling.json index 9ec634354d3..60b15326e83 100644 --- a/erpnext/selling/desk_page/selling/selling.json +++ b/erpnext/selling/desk_page/selling/selling.json @@ -1,5 +1,10 @@ { "cards": [ + { + "hidden": 0, + "label": "Selling", + "links": "[\n {\n \"description\": \"Customer Database.\",\n \"label\": \"Customer\",\n \"name\": \"Customer\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Quotes to Leads or Customers.\",\n \"label\": \"Quotation\",\n \"name\": \"Quotation\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Confirmed orders from Customers.\",\n \"label\": \"Sales Order\",\n \"name\": \"Sales Order\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"label\": \"Sales Invoice\",\n \"name\": \"Sales Invoice\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Blanket Orders from Costumers.\",\n \"label\": \"Blanket Order\",\n \"name\": \"Blanket Order\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\"\n ],\n \"description\": \"Manage Sales Partners.\",\n \"label\": \"Sales Partner\",\n \"name\": \"Sales Partner\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Manage Sales Person Tree.\",\n \"icon\": \"fa fa-sitemap\",\n \"label\": \"Sales Person\",\n \"link\": \"Tree/Sales Person\",\n \"name\": \"Sales Person\",\n \"type\": \"doctype\"\n }\n]" + }, { "hidden": 0, "label": "Items and Pricing", @@ -10,29 +15,25 @@ "label": "Settings", "links": "[\n {\n \"description\": \"Default settings for selling transactions.\",\n \"label\": \"Selling Settings\",\n \"name\": \"Selling Settings\",\n \"settings\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Template of terms or contract.\",\n \"label\": \"Terms and Conditions Template\",\n \"name\": \"Terms and Conditions\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Tax template for selling transactions.\",\n \"label\": \"Sales Taxes and Charges Template\",\n \"name\": \"Sales Taxes and Charges Template\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Track Leads by Lead Source.\",\n \"label\": \"Lead Source\",\n \"name\": \"Lead Source\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Manage Customer Group Tree.\",\n \"icon\": \"fa fa-sitemap\",\n \"label\": \"Customer Group\",\n \"link\": \"Tree/Customer Group\",\n \"name\": \"Customer Group\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"All Contacts.\",\n \"label\": \"Contact\",\n \"name\": \"Contact\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"All Addresses.\",\n \"label\": \"Address\",\n \"name\": \"Address\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Manage Territory Tree.\",\n \"icon\": \"fa fa-sitemap\",\n \"label\": \"Territory\",\n \"link\": \"Tree/Territory\",\n \"name\": \"Territory\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Sales campaigns.\",\n \"label\": \"Campaign\",\n \"name\": \"Campaign\",\n \"type\": \"doctype\"\n }\n]" }, - { - "hidden": 0, - "label": "Other Reports", - "links": "[\n {\n \"dependencies\": [\n \"Lead\"\n ],\n \"doctype\": \"Lead\",\n \"is_query_report\": true,\n \"label\": \"Lead Details\",\n \"name\": \"Lead Details\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Address\"\n ],\n \"doctype\": \"Address\",\n \"is_query_report\": true,\n \"label\": \"Customer Addresses And Contacts\",\n \"name\": \"Address And Contacts\",\n \"route_options\": {\n \"party_type\": \"Customer\"\n },\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"BOM\"\n ],\n \"doctype\": \"BOM\",\n \"is_query_report\": true,\n \"label\": \"BOM Search\",\n \"name\": \"BOM Search\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Item\"\n ],\n \"doctype\": \"Item\",\n \"is_query_report\": true,\n \"label\": \"Available Stock for Packing Items\",\n \"name\": \"Available Stock for Packing Items\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Pending SO Items For Purchase Request\",\n \"name\": \"Pending SO Items For Purchase Request\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"is_query_report\": true,\n \"label\": \"Customer Credit Balance\",\n \"name\": \"Customer Credit Balance\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"is_query_report\": true,\n \"label\": \"Customers Without Any Sales Transactions\",\n \"name\": \"Customers Without Any Sales Transactions\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"is_query_report\": true,\n \"label\": \"Sales Partners Commission\",\n \"name\": \"Sales Partners Commission\",\n \"type\": \"report\"\n }\n]" - }, - { - "hidden": 0, - "label": "Sales", - "links": "[\n {\n \"description\": \"Customer Database.\",\n \"label\": \"Customer\",\n \"name\": \"Customer\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Quotes to Leads or Customers.\",\n \"label\": \"Quotation\",\n \"name\": \"Quotation\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Confirmed orders from Customers.\",\n \"label\": \"Sales Order\",\n \"name\": \"Sales Order\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Invoices for Costumers.\",\n \"label\": \"Sales Invoice\",\n \"name\": \"Sales Invoice\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Blanket Orders from Costumers.\",\n \"label\": \"Blanket Order\",\n \"name\": \"Blanket Order\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\"\n ],\n \"description\": \"Manage Sales Partners.\",\n \"label\": \"Sales Partner\",\n \"name\": \"Sales Partner\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Manage Sales Person Tree.\",\n \"icon\": \"fa fa-sitemap\",\n \"label\": \"Sales Person\",\n \"link\": \"Tree/Sales Person\",\n \"name\": \"Sales Person\",\n \"type\": \"doctype\"\n }\n]" - }, { "hidden": 0, "label": "Key Reports", - "links": "[\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Analytics\",\n \"name\": \"Sales Analytics\",\n \"onboard\": 1,\n \"type\": \"report\"\n },\n {\n \"icon\": \"fa fa-bar-chart\",\n \"label\": \"Sales Funnel\",\n \"name\": \"sales-funnel\",\n \"onboard\": 1,\n \"type\": \"page\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"icon\": \"fa fa-bar-chart\",\n \"is_query_report\": true,\n \"label\": \"Customer Acquisition and Loyalty\",\n \"name\": \"Customer Acquisition and Loyalty\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Inactive Customers\",\n \"name\": \"Inactive Customers\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Ordered Items To Be Delivered\",\n \"name\": \"Ordered Items To Be Delivered\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Person-wise Transaction Summary\",\n \"name\": \"Sales Person-wise Transaction Summary\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Item\"\n ],\n \"doctype\": \"Item\",\n \"is_query_report\": true,\n \"label\": \"Item-wise Sales History\",\n \"name\": \"Item-wise Sales History\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Quotation\"\n ],\n \"doctype\": \"Quotation\",\n \"is_query_report\": true,\n \"label\": \"Quotation Trends\",\n \"name\": \"Quotation Trends\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Order Trends\",\n \"name\": \"Sales Order Trends\",\n \"type\": \"report\"\n }\n]" + "links": "[\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Analytics\",\n \"name\": \"Sales Analytics\",\n \"onboard\": 1,\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Order Analysis\",\n \"name\": \"Sales Order Analysis\",\n \"onboard\": 1,\n \"type\": \"report\"\n },\n {\n \"icon\": \"fa fa-bar-chart\",\n \"label\": \"Sales Funnel\",\n \"name\": \"sales-funnel\",\n \"onboard\": 1,\n \"type\": \"page\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Order Trends\",\n \"name\": \"Sales Order Trends\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Quotation\"\n ],\n \"doctype\": \"Quotation\",\n \"is_query_report\": true,\n \"label\": \"Quotation Trends\",\n \"name\": \"Quotation Trends\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"icon\": \"fa fa-bar-chart\",\n \"is_query_report\": true,\n \"label\": \"Customer Acquisition and Loyalty\",\n \"name\": \"Customer Acquisition and Loyalty\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Inactive Customers\",\n \"name\": \"Inactive Customers\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Person-wise Transaction Summary\",\n \"name\": \"Sales Person-wise Transaction Summary\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Item\"\n ],\n \"doctype\": \"Item\",\n \"is_query_report\": true,\n \"label\": \"Item-wise Sales History\",\n \"name\": \"Item-wise Sales History\",\n \"type\": \"report\"\n }\n]" + }, + { + "hidden": 0, + "label": "Other Reports", + "links": "[\n {\n \"dependencies\": [\n \"Lead\"\n ],\n \"doctype\": \"Lead\",\n \"is_query_report\": true,\n \"label\": \"Lead Details\",\n \"name\": \"Lead Details\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Address\"\n ],\n \"doctype\": \"Address\",\n \"is_query_report\": true,\n \"label\": \"Customer Addresses And Contacts\",\n \"name\": \"Address And Contacts\",\n \"route_options\": {\n \"party_type\": \"Customer\"\n },\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Item\"\n ],\n \"doctype\": \"Item\",\n \"is_query_report\": true,\n \"label\": \"Available Stock for Packing Items\",\n \"name\": \"Available Stock for Packing Items\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Pending SO Items For Purchase Request\",\n \"name\": \"Pending SO Items For Purchase Request\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"is_query_report\": true,\n \"label\": \"Customer Credit Balance\",\n \"name\": \"Customer Credit Balance\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"is_query_report\": true,\n \"label\": \"Customers Without Any Sales Transactions\",\n \"name\": \"Customers Without Any Sales Transactions\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"is_query_report\": true,\n \"label\": \"Sales Partners Commission\",\n \"name\": \"Sales Partners Commission\",\n \"type\": \"report\"\n }\n]" } ], "category": "Modules", "charts": [ { - "chart_name": "Incoming Bills (Purchase Invoice)", - "label": "Income" + "chart_name": "Sales Order Trends", + "label": "Sales Order Trends" } ], + "charts_label": "Selling ", "creation": "2020-01-28 11:49:12.092882", "developer_mode_only": 0, "disable_user_customization": 0, @@ -43,52 +44,49 @@ "idx": 0, "is_standard": 1, "label": "Selling", - "modified": "2020-06-03 13:23:24.861706", + "modified": "2020-06-19 13:23:24.861706", "modified_by": "Administrator", "module": "Selling", "name": "Selling", + "onboarding": "Selling", "owner": "Administrator", "pin_to_bottom": 0, "pin_to_top": 0, "shortcuts": [ { - "color": "#ffe8cd", - "format": "{} Draft", - "label": "Sales Invoice", - "link_to": "Sales Invoice", - "stats_filter": "{ \"status\": \"Draft\" }", + "color": "#cef6d1", + "format": "{} Available", + "label": "Item", + "link_to": "Item", + "stats_filter": "{\n \"disabled\":0\n}", "type": "DocType" }, { "color": "#ffe8cd", - "format": "{} To Deliver", + "format": "{} To Deliver", "label": "Sales Order", "link_to": "Sales Order", - "stats_filter": "{\"Status\": \"To Deliver and Bill\"}", + "stats_filter": "{\n \"company\": [\"like\", '%' + frappe.defaults.get_global_default(\"company\") + '%'],\n \"status\":[\"in\", [\"To Deliver\", \"To Deliver and Bill\"]]\n}", "type": "DocType" }, { "color": "#cef6d1", "format": "{} Open", - "label": "Quotation", - "link_to": "Quotation", + "label": "Sales Analytics", + "link_to": "Sales Analytics", "stats_filter": "{ \"Status\": \"Open\" }", - "type": "DocType" - }, - { - "label": "Delivery Note", - "link_to": "Delivery Note", - "type": "DocType" - }, - { - "label": "Accounts Receivable", - "link_to": "Accounts Receivable", "type": "Report" }, { - "label": "Sales Register", - "link_to": "Sales Register", + "label": "Sales Order Analysis", + "link_to": "Sales Order Analysis", "type": "Report" + }, + { + "label": "Dashboard", + "link_to": "Selling", + "type": "Dashboard" } - ] + ], + "shortcuts_label": "Quick Access" } \ No newline at end of file diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.js b/erpnext/selling/doctype/selling_settings/selling_settings.js index cf6fb2806ee..95a4243fb45 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.js +++ b/erpnext/selling/doctype/selling_settings/selling_settings.js @@ -6,3 +6,26 @@ frappe.ui.form.on('Selling Settings', { } }); + +frappe.tour['Selling Settings'] = [ + { + fieldname: "cust_master_name", + title: "Customer Naming By", + description: __("By default, the Customer Name is set as per the Full Name entered. If you want Customers to be named by a ") + "Naming Series" + __(" choose the 'Naming Series' option."), + }, + { + fieldname: "selling_price_list", + title: "Default Selling Price List", + description: __("Configure the default Price List when creating a new Sales transaction. Item prices will be fetched from this Price List.") + }, + { + fieldname: "so_required", + title: "Sales Order Required for Sales Invoice & Delivery Note Creation", + description: __("If this option is configured 'Yes', ERPNext will prevent you from creating a Sales Invoice or Delivery Note without creating a Sales Order first. This configuration can be overridden for a particular Customer by enabling the 'Allow Sales Invoice Creation Without Sales Order' checkbox in the Customer master.") + }, + { + fieldname: "dn_required", + title: "Delivery Note Required for Sales Invoice Creation", + description: __("If this option is configured 'Yes', ERPNext will prevent you from creating a Sales Invoice without creating a Delivery Note first. This configuration can be overridden for a particular Customer by enabling the 'Allow Sales Invoice Creation Without Delivery Note' checkbox in the Customer master.") + } +]; \ No newline at end of file diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.json b/erpnext/selling/doctype/selling_settings/selling_settings.json index c04bfd281e2..dcbc0748f7d 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.json +++ b/erpnext/selling/doctype/selling_settings/selling_settings.json @@ -1,4 +1,5 @@ { + "actions": [], "creation": "2013-06-25 10:25:16", "description": "Settings for Selling Module", "doctype": "DocType", @@ -79,13 +80,13 @@ { "fieldname": "so_required", "fieldtype": "Select", - "label": "Sales Order Required", + "label": "Sales Order Required for Sales Invoice & Delivery Note Creation", "options": "No\nYes" }, { "fieldname": "dn_required", "fieldtype": "Select", - "label": "Delivery Note Required", + "label": "Delivery Note Required for Sales Invoice Creation", "options": "No\nYes" }, { @@ -137,7 +138,8 @@ "icon": "fa fa-cog", "idx": 1, "issingle": 1, - "modified": "2019-12-09 13:38:36.486298", + "links": [], + "modified": "2020-06-01 13:58:35.637858", "modified_by": "Administrator", "module": "Selling", "name": "Selling Settings", diff --git a/erpnext/selling/module_onboarding/selling/selling.json b/erpnext/selling/module_onboarding/selling/selling.json new file mode 100644 index 00000000000..10a33c9cf52 --- /dev/null +++ b/erpnext/selling/module_onboarding/selling/selling.json @@ -0,0 +1,54 @@ +{ + "allow_roles": [ + { + "role": "Sales Manager" + }, + { + "role": "Sales User" + }, + { + "role": "Stock Manager" + }, + { + "role": "Stock User" + } + ], + "creation": "2020-06-01 12:44:42.589930", + "docstatus": 0, + "doctype": "Module Onboarding", + "documentation_url": "https://docs.erpnext.com/docs/user/manual/en/selling", + "idx": 0, + "is_complete": 0, + "modified": "2020-06-01 13:35:16.100512", + "modified_by": "Administrator", + "module": "Selling", + "name": "Selling", + "owner": "Administrator", + "steps": [ + { + "step": "Introduction to Selling" + }, + { + "step": "Create a Customer" + }, + { + "step": "Setup your Warehouse" + }, + { + "step": "Create a Product" + }, + { + "step": "Create a Quotation" + }, + { + "step": "Create your first Sales Order" + }, + { + "step": "Selling Settings" + } + ], + "subtitle": "Products, Sales, Analysis and more.", + "success_message": "The Selling Module is all set up!", + "title": "Let's Set Up the Selling Module.", + "user_can_dismiss": 1 +} \ No newline at end of file diff --git a/erpnext/selling/onboarding_step/create_a_customer/create_a_customer.json b/erpnext/selling/onboarding_step/create_a_customer/create_a_customer.json new file mode 100644 index 00000000000..5a403b06cf0 --- /dev/null +++ b/erpnext/selling/onboarding_step/create_a_customer/create_a_customer.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-05-14 17:46:41.831517", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-06-01 13:16:19.731719", + "modified_by": "Administrator", + "name": "Create a Customer", + "owner": "Administrator", + "reference_document": "Customer", + "show_full_form": 0, + "title": "Create a Customer", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/selling/onboarding_step/create_a_product/create_a_product.json b/erpnext/selling/onboarding_step/create_a_product/create_a_product.json new file mode 100644 index 00000000000..d2068e167b7 --- /dev/null +++ b/erpnext/selling/onboarding_step/create_a_product/create_a_product.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-05-12 18:16:06.624554", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-05-12 18:30:02.489949", + "modified_by": "Administrator", + "name": "Create a Product", + "owner": "Administrator", + "reference_document": "Item", + "show_full_form": 0, + "title": "Create a Product", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/selling/onboarding_step/create_a_quotation/create_a_quotation.json b/erpnext/selling/onboarding_step/create_a_quotation/create_a_quotation.json new file mode 100644 index 00000000000..27253d15b6c --- /dev/null +++ b/erpnext/selling/onboarding_step/create_a_quotation/create_a_quotation.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-06-01 13:34:58.958641", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-06-01 13:34:58.958641", + "modified_by": "Administrator", + "name": "Create a Quotation", + "owner": "Administrator", + "reference_document": "Quotation", + "show_full_form": 1, + "title": "Create a Quotation", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/selling/onboarding_step/create_product/create_product.json b/erpnext/selling/onboarding_step/create_product/create_product.json new file mode 100644 index 00000000000..0ffa30158b0 --- /dev/null +++ b/erpnext/selling/onboarding_step/create_product/create_product.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-05-05 16:42:31.476275", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 1, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-05-19 12:50:59.010439", + "modified_by": "Administrator", + "name": "Create Product", + "owner": "Administrator", + "reference_document": "Item", + "show_full_form": 0, + "title": "Create a Finished Good", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/selling/onboarding_step/create_your_first_sales_order/create_your_first_sales_order.json b/erpnext/selling/onboarding_step/create_your_first_sales_order/create_your_first_sales_order.json new file mode 100644 index 00000000000..5b601a7a900 --- /dev/null +++ b/erpnext/selling/onboarding_step/create_your_first_sales_order/create_your_first_sales_order.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-06-01 12:52:27.181841", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 1, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-06-01 12:52:27.181841", + "modified_by": "Administrator", + "name": "Create your first Sales Order", + "owner": "Administrator", + "reference_document": "Sales Order", + "show_full_form": 1, + "title": "Create your first Sales Order", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/selling/onboarding_step/introduction_to_selling/introduction_to_selling.json b/erpnext/selling/onboarding_step/introduction_to_selling/introduction_to_selling.json new file mode 100644 index 00000000000..d21c1f4954b --- /dev/null +++ b/erpnext/selling/onboarding_step/introduction_to_selling/introduction_to_selling.json @@ -0,0 +1,19 @@ +{ + "action": "Watch Video", + "creation": "2020-06-01 12:44:32.089234", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-06-01 13:29:13.703177", + "modified_by": "Administrator", + "name": "Introduction to Selling", + "owner": "Administrator", + "show_full_form": 0, + "title": "Introduction to Selling", + "validate_action": 1, + "video_url": "https://youtu.be/1eP90MWoDQM" +} \ No newline at end of file diff --git a/erpnext/selling/onboarding_step/selling_settings/selling_settings.json b/erpnext/selling/onboarding_step/selling_settings/selling_settings.json new file mode 100644 index 00000000000..7996d7b1593 --- /dev/null +++ b/erpnext/selling/onboarding_step/selling_settings/selling_settings.json @@ -0,0 +1,19 @@ +{ + "action": "Show Form Tour", + "creation": "2020-06-01 13:01:45.615189", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 0, + "is_single": 1, + "is_skipped": 0, + "modified": "2020-06-01 13:04:14.980743", + "modified_by": "Administrator", + "name": "Selling Settings", + "owner": "Administrator", + "reference_document": "Selling Settings", + "show_full_form": 0, + "title": "Configure Selling Settings.", + "validate_action": 0 +} \ No newline at end of file diff --git a/erpnext/selling/onboarding_step/setup_your_warehouse/setup_your_warehouse.json b/erpnext/selling/onboarding_step/setup_your_warehouse/setup_your_warehouse.json new file mode 100644 index 00000000000..557c905bd6c --- /dev/null +++ b/erpnext/selling/onboarding_step/setup_your_warehouse/setup_your_warehouse.json @@ -0,0 +1,20 @@ +{ + "action": "Go to Page", + "creation": "2020-05-19 18:54:19.383397", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-05-19 18:54:19.383397", + "modified_by": "Administrator", + "name": "Setup your Warehouse", + "owner": "Administrator", + "path": "Tree/Warehouse", + "reference_document": "Warehouse", + "show_full_form": 0, + "title": "Setup your Warehouse", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.js b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.js index daca2e3bd0c..f47d67fe494 100644 --- a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.js +++ b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.js @@ -12,12 +12,6 @@ frappe.query_reports["Item-wise Sales History"] = { default: frappe.defaults.get_user_default("Company"), reqd: 1 }, - { - fieldname:"item_group", - label: __("Item Group"), - fieldtype: "Link", - options: "Item Group" - }, { fieldname:"from_date", reqd: 1, @@ -32,6 +26,38 @@ frappe.query_reports["Item-wise Sales History"] = { label: __("To Date"), fieldtype: "Date", }, + { + fieldname:"item_group", + label: __("Item Group"), + fieldtype: "Link", + options: "Item Group" + }, + { + fieldname:"item_code", + label: __("Item"), + fieldtype: "Link", + options: "Item", + get_query: () => { + return { + query: "erpnext.controllers.queries.item_query" + } + } + }, + { + fieldname:"customer", + label: __("Customer"), + fieldtype: "Link", + options: "Customer" + } + ], - ] + "formatter": function (value, row, column, data, default_formatter) { + value = default_formatter(value, row, column, data); + let format_fields = ["delivered_quantity", "billed_amount"]; + + if (in_list(format_fields, column.fieldname) && data && data[column.fieldname] > 0) { + value = "" + value + ""; + } + return value; + } }; \ No newline at end of file diff --git a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py index 08a98ba6c07..bd59be663ad 100644 --- a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py +++ b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py @@ -11,7 +11,10 @@ def execute(filters=None): filters = frappe._dict(filters or {}) columns = get_columns(filters) data = get_data(filters) - return columns, data + + chart_data = get_chart_data(data) + + return columns, data, None, chart_data def get_columns(filters): return [ @@ -181,6 +184,12 @@ def get_conditions(filters): if filters.get('to_date'): conditions += "AND so.transaction_date <= '%s'" %filters.to_date + if filters.get("item_code"): + conditions += "AND so_item.item_code = '%s'" %frappe.db.escape(filters.item_code) + + if filters.get("customer"): + conditions += "AND so.customer = '%s'" %frappe.db.escape(filters.customer) + return conditions def get_customer_details(): @@ -212,3 +221,34 @@ def get_sales_order_details(company_list, filters): AND so.company in ({0}) AND so.docstatus = 1 {1} """.format(','.join(["%s"] * len(company_list)), conditions), tuple(company_list), as_dict=1) + +def get_chart_data(data): + item_wise_sales_map = {} + labels, datapoints = [], [] + + for row in data: + item_key = row.get("item_code") + + if not item_key in item_wise_sales_map: + item_wise_sales_map[item_key] = 0 + + item_wise_sales_map[item_key] = flt(item_wise_sales_map[item_key]) + flt(row.get("amount")) + + item_wise_sales_map = { item: value for item, value in (sorted(item_wise_sales_map.items(), key = lambda i: i[1], reverse=True))} + + for key in item_wise_sales_map: + labels.append(key) + datapoints.append(item_wise_sales_map[key]) + + return { + "data" : { + "labels" : labels[:30], # show max of 30 items in chart + "datasets" : [ + { + "name" : _(" Total Sales Amount"), + "values" : datapoints[:30] + } + ] + }, + "type" : "bar" + } \ No newline at end of file diff --git a/erpnext/selling/report/quotation_trends/quotation_trends.py b/erpnext/selling/report/quotation_trends/quotation_trends.py index 67375f98b31..968e2ff26f7 100644 --- a/erpnext/selling/report/quotation_trends/quotation_trends.py +++ b/erpnext/selling/report/quotation_trends/quotation_trends.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import frappe +from frappe import _ from erpnext.controllers.trends import get_columns, get_data def execute(filters=None): @@ -11,4 +12,48 @@ def execute(filters=None): conditions = get_columns(filters, "Quotation") data = get_data(filters, conditions) - return conditions["columns"], data \ No newline at end of file + chart_data = get_chart_data(data, conditions, filters) + + return conditions["columns"], data, None, chart_data + +def get_chart_data(data, conditions, filters): + if not (data and conditions): + return [] + + datapoints = [] + + start = 2 if filters.get("based_on") in ["Item", "Customer"] else 1 + if filters.get("group_by"): + start += 1 + + # fetch only periodic columns as labels + columns = conditions.get("columns")[start:-2][1::2] + labels = [column.split(':')[0] for column in columns] + datapoints = [0] * len(labels) + + for row in data: + # If group by filter, don't add first row of group (it's already summed) + if not row[start-1]: + continue + # Remove None values and compute only periodic data + row = [x if x else 0 for x in row[start:-2]] + row = row[1::2] + + for i in range(len(row)): + datapoints[i] += row[i] + + return { + "data" : { + "labels" : labels, + "datasets" : [ + { + "name" : _("{0}").format(filters.get("period")) + _(" Quoted Amount"), + "values" : datapoints + } + ] + }, + "type" : "line", + "lineOptions": { + "regionFill": 1 + } + } diff --git a/erpnext/accounts/report/ordered_items_to_be_billed/__init__.py b/erpnext/selling/report/sales_order_analysis/__init__.py similarity index 100% rename from erpnext/accounts/report/ordered_items_to_be_billed/__init__.py rename to erpnext/selling/report/sales_order_analysis/__init__.py diff --git a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js new file mode 100644 index 00000000000..76a5bb51ca1 --- /dev/null +++ b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js @@ -0,0 +1,85 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.query_reports["Sales Order Analysis"] = { + "filters": [ + { + "fieldname": "company", + "label": __("Company"), + "fieldtype": "Link", + "width": "80", + "options": "Company", + "reqd": 1, + "default": frappe.defaults.get_default("company") + }, + { + "fieldname":"from_date", + "label": __("From Date"), + "fieldtype": "Date", + "width": "80", + "reqd": 1, + "default": frappe.datetime.add_months(frappe.datetime.get_today(), -1), + }, + { + "fieldname":"to_date", + "label": __("To Date"), + "fieldtype": "Date", + "width": "80", + "reqd": 1, + "default": frappe.datetime.get_today() + }, + { + "fieldname": "sales_order", + "label": __("Sales Order"), + "fieldtype": "MultiSelectList", + "width": "80", + "options": "Sales Order", + "get_data": function(txt) { + return frappe.db.get_link_options("Sales Order", txt); + }, + "get_query": () =>{ + return { + filters: { "docstatus": 1 } + } + } + }, + { + "fieldname": "status", + "label": __("Status"), + "fieldtype": "MultiSelectList", + "width": "80", + get_data: function(txt) { + let status = ["To Bill", "To Deliver", "To Deliver and Bill", "Completed"] + let options = [] + for (let option of status){ + options.push({ + "value": option, + "description": "" + }) + } + return options + } + }, + { + "fieldname": "group_by_so", + "label": __("Group by Sales Order"), + "fieldtype": "Check", + "default": 0 + } + ], + + "formatter": function (value, row, column, data, default_formatter) { + value = default_formatter(value, row, column, data); + let format_fields = ["delivered_qty", "billed_amount"]; + + if (in_list(format_fields, column.fieldname) && data && data[column.fieldname] > 0) { + value = "" + value + ""; + } + + if (column.fieldname == "delay" && data && data[column.fieldname] > 0) { + value = "" + value + ""; + } + return value; + } +}; diff --git a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.json b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.json new file mode 100644 index 00000000000..c0b1d9aa8c2 --- /dev/null +++ b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.json @@ -0,0 +1,36 @@ +{ + "add_total_row": 1, + "creation": "2020-05-29 14:54:53.591445", + "disable_prepared_report": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "modified": "2020-05-29 14:54:53.591445", + "modified_by": "Administrator", + "module": "Selling", + "name": "Sales Order Analysis", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Sales Order", + "report_name": "Sales Order Analysis", + "report_type": "Script Report", + "roles": [ + { + "role": "Sales User" + }, + { + "role": "Sales Manager" + }, + { + "role": "Maintenance User" + }, + { + "role": "Accounts User" + }, + { + "role": "Stock User" + } + ] +} \ No newline at end of file diff --git a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py new file mode 100644 index 00000000000..7e8e6e9e8bd --- /dev/null +++ b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.py @@ -0,0 +1,279 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +import copy +from frappe import _ +from frappe.utils import flt, date_diff, getdate + +def execute(filters=None): + if not filters: + return [], [], None, [] + + validate_filters(filters) + + columns = get_columns(filters) + conditions = get_conditions(filters) + data = get_data(conditions, filters) + + if not data: + return [], [], None, [] + + data, chart_data = prepare_data(data, filters) + + return columns, data, None, chart_data + +def validate_filters(filters): + from_date, to_date = filters.get("from_date"), filters.get("to_date") + + if not from_date and to_date: + frappe.throw(_("From and To Dates are required.")) + elif date_diff(to_date, from_date) < 0: + frappe.throw(_("To Date cannot be before From Date.")) + +def get_conditions(filters): + conditions = "" + if filters.get("from_date") and filters.get("to_date"): + conditions += " and so.transaction_date between %(from_date)s and %(to_date)s" + + if filters.get("company"): + conditions += " and so.company = %(company)s" + + if filters.get("sales_order"): + conditions += " and so.name in %(sales_order)s" + + if filters.get("status"): + conditions += " and so.status in %(status)s" + + return conditions + +def get_data(conditions, filters): + data = frappe.db.sql(""" + SELECT + so.transaction_date as date, + soi.delivery_date as delivery_date, + so.name as sales_order, + so.status, so.customer, soi.item_code, + DATEDIFF(CURDATE(), soi.delivery_date) as delay_days, + IF(so.status in ('Completed','To Bill'), 0, (SELECT delay_days)) as delay, + soi.qty, soi.delivered_qty, + (soi.qty - soi.delivered_qty) AS pending_qty, + IFNULL(sii.qty, 0) as billed_qty, + soi.base_amount as amount, + (soi.delivered_qty * soi.base_rate) as delivered_qty_amount, + (soi.billed_amt * IFNULL(so.conversion_rate, 1)) as billed_amount, + (soi.base_amount - (soi.billed_amt * IFNULL(so.conversion_rate, 1))) as pending_amount, + soi.warehouse as warehouse, + so.company, soi.name + FROM + `tabSales Order` so, + `tabSales Order Item` soi + LEFT JOIN `tabSales Invoice Item` sii + ON sii.so_detail = soi.name + WHERE + soi.parent = so.name + and so.status not in ('Stopped', 'Closed', 'On Hold') + and so.docstatus = 1 + {conditions} + GROUP BY soi.name + ORDER BY so.transaction_date ASC + """.format(conditions=conditions), filters, as_dict=1) + + return data + +def prepare_data(data, filters): + completed, pending = 0, 0 + + if filters.get("group_by_so"): + sales_order_map = {} + + for row in data: + # sum data for chart + completed += row["billed_amount"] + pending += row["pending_amount"] + + # prepare data for report view + row["qty_to_bill"] = flt(row["qty"]) - flt(row["billed_qty"]) + + row["delay"] = 0 if row["delay"] < 0 else row["delay"] + if filters.get("group_by_so"): + so_name = row["sales_order"] + + if not so_name in sales_order_map: + # create an entry + row_copy = copy.deepcopy(row) + sales_order_map[so_name] = row_copy + else: + # update existing entry + so_row = sales_order_map[so_name] + so_row["required_date"] = max(getdate(so_row["delivery_date"]), getdate(row["delivery_date"])) + so_row["delay"] = min(so_row["delay"], row["delay"]) + + # sum numeric columns + fields = ["qty", "delivered_qty", "pending_qty", "billed_qty", "qty_to_bill", "amount", + "delivered_qty_amount", "billed_amount", "pending_amount"] + for field in fields: + so_row[field] = flt(row[field]) + flt(so_row[field]) + + chart_data = prepare_chart_data(pending, completed) + + if filters.get("group_by_so"): + data = [] + for so in sales_order_map: + data.append(sales_order_map[so]) + return data, chart_data + + return data, chart_data + +def prepare_chart_data(pending, completed): + labels = ["Amount to Bill", "Billed Amount"] + + return { + "data" : { + "labels": labels, + "datasets": [ + {"values": [pending, completed]} + ] + }, + "type": 'donut', + "height": 300 + } + +def get_columns(filters): + columns = [ + { + "label":_("Date"), + "fieldname": "date", + "fieldtype": "Date", + "width": 90 + }, + { + "label": _("Sales Order"), + "fieldname": "sales_order", + "fieldtype": "Link", + "options": "Sales Order", + "width": 160 + }, + { + "label":_("Status"), + "fieldname": "status", + "fieldtype": "Data", + "width": 130 + }, + { + "label": _("Customer"), + "fieldname": "customer", + "fieldtype": "Link", + "options": "Customer", + "width": 130 + }] + + if not filters.get("group_by_so"): + columns.append({ + "label":_("Item Code"), + "fieldname": "item_code", + "fieldtype": "Link", + "options": "Item", + "width": 100 + }) + + columns.extend([ + { + "label": _("Qty"), + "fieldname": "qty", + "fieldtype": "Float", + "width": 120, + "convertible": "qty" + }, + { + "label": _("Delivered Qty"), + "fieldname": "delivered_qty", + "fieldtype": "Float", + "width": 120, + "convertible": "qty" + }, + { + "label": _("Qty to Deliver"), + "fieldname": "pending_qty", + "fieldtype": "Float", + "width": 120, + "convertible": "qty" + }, + { + "label": _("Billed Qty"), + "fieldname": "billed_qty", + "fieldtype": "Float", + "width": 80, + "convertible": "qty" + }, + { + "label": _("Qty to Bill"), + "fieldname": "qty_to_bill", + "fieldtype": "Float", + "width": 80, + "convertible": "qty" + }, + { + "label": _("Amount"), + "fieldname": "amount", + "fieldtype": "Currency", + "width": 110, + "options": "Company:company:default_currency", + "convertible": "rate" + }, + { + "label": _("Billed Amount"), + "fieldname": "billed_amount", + "fieldtype": "Currency", + "width": 110, + "options": "Company:company:default_currency", + "convertible": "rate" + }, + { + "label": _("Pending Amount"), + "fieldname": "pending_amount", + "fieldtype": "Currency", + "width": 130, + "options": "Company:company:default_currency", + "convertible": "rate" + }, + { + "label": _("Amount Delivered"), + "fieldname": "delivered_qty_amount", + "fieldtype": "Currency", + "width": 100, + "options": "Company:company:default_currency", + "convertible": "rate" + }, + { + "label":_("Delivery Date"), + "fieldname": "delivery_date", + "fieldtype": "Date", + "width": 120 + }, + { + "label": _("Delay (in Days)"), + "fieldname": "delay", + "fieldtype": "Data", + "width": 100 + } + ]) + if not filters.get("group_by_so"): + columns.append({ + "label": _("Warehouse"), + "fieldname": "warehouse", + "fieldtype": "Link", + "options": "Warehouse", + "width": 100 + }) + columns.append({ + "label": _("Company"), + "fieldname": "company", + "fieldtype": "Link", + "options": "Company", + "width": 100 + }) + + + return columns \ No newline at end of file diff --git a/erpnext/selling/report/sales_order_trends/sales_order_trends.py b/erpnext/selling/report/sales_order_trends/sales_order_trends.py index c0a0f085d99..de7d3f2f778 100644 --- a/erpnext/selling/report/sales_order_trends/sales_order_trends.py +++ b/erpnext/selling/report/sales_order_trends/sales_order_trends.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import frappe +from frappe import _ from erpnext.controllers.trends import get_columns,get_data def execute(filters=None): @@ -10,4 +11,48 @@ def execute(filters=None): data = [] conditions = get_columns(filters, "Sales Order") data = get_data(filters, conditions) - return conditions["columns"], data + chart_data = get_chart_data(data, conditions, filters) + + return conditions["columns"], data, None, chart_data + +def get_chart_data(data, conditions, filters): + if not (data and conditions): + return [] + + datapoints = [] + + start = 2 if filters.get("based_on") in ["Item", "Customer"] else 1 + if filters.get("group_by"): + start += 1 + + # fetch only periodic columns as labels + columns = conditions.get("columns")[start:-2][1::2] + labels = [column.split(':')[0] for column in columns] + datapoints = [0] * len(labels) + + for row in data: + # If group by filter, don't add first row of group (it's already summed) + if not row[start-1]: + continue + # Remove None values and compute only periodic data + row = [x if x else 0 for x in row[start:-2]] + row = row[1::2] + + for i in range(len(row)): + datapoints[i] += row[i] + + return { + "data" : { + "labels" : labels, + "datasets" : [ + { + "name" : _("{0}").format(filters.get("period")) + _(" Sales Value"), + "values" : datapoints + } + ] + }, + "type" : "line", + "lineOptions": { + "regionFill": 1 + } + } diff --git a/erpnext/stock/desk_page/stock/stock.json b/erpnext/stock/desk_page/stock/stock.json index 9404292c04f..1bf81f7f0e8 100644 --- a/erpnext/stock/desk_page/stock/stock.json +++ b/erpnext/stock/desk_page/stock/stock.json @@ -33,7 +33,7 @@ { "hidden": 0, "label": "Key Reports", - "links": "[\n {\n \"dependencies\": [\n \"Item Price\"\n ],\n \"doctype\": \"Item Price\",\n \"is_query_report\": false,\n \"label\": \"Item-wise Price List Rate\",\n \"name\": \"Item-wise Price List Rate\",\n \"onboard\": 1,\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Stock Entry\"\n ],\n \"doctype\": \"Stock Entry\",\n \"is_query_report\": true,\n \"label\": \"Stock Analytics\",\n \"name\": \"Stock Analytics\",\n \"onboard\": 1,\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Delivery Note\"\n ],\n \"doctype\": \"Delivery Note\",\n \"is_query_report\": true,\n \"label\": \"Delivery Note Trends\",\n \"name\": \"Delivery Note Trends\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Purchase Receipt\"\n ],\n \"doctype\": \"Purchase Receipt\",\n \"is_query_report\": true,\n \"label\": \"Purchase Receipt Trends\",\n \"name\": \"Purchase Receipt Trends\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Delivery Note\"\n ],\n \"doctype\": \"Delivery Note\",\n \"is_query_report\": true,\n \"label\": \"Ordered Items To Be Delivered\",\n \"name\": \"Ordered Items To Be Delivered\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Purchase Order\"\n ],\n \"doctype\": \"Purchase Order\",\n \"is_query_report\": true,\n \"label\": \"Purchase Order Analysis\",\n \"name\": \"Purchase Order Analysis\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Bin\"\n ],\n \"doctype\": \"Bin\",\n \"is_query_report\": true,\n \"label\": \"Item Shortage Report\",\n \"name\": \"Item Shortage Report\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Batch\"\n ],\n \"doctype\": \"Batch\",\n \"is_query_report\": true,\n \"label\": \"Batch-Wise Balance History\",\n \"name\": \"Batch-Wise Balance History\",\n \"type\": \"report\"\n }\n]" + "links": "[\n {\n \"dependencies\": [\n \"Item Price\"\n ],\n \"doctype\": \"Item Price\",\n \"is_query_report\": false,\n \"label\": \"Item-wise Price List Rate\",\n \"name\": \"Item-wise Price List Rate\",\n \"onboard\": 1,\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Stock Entry\"\n ],\n \"doctype\": \"Stock Entry\",\n \"is_query_report\": true,\n \"label\": \"Stock Analytics\",\n \"name\": \"Stock Analytics\",\n \"onboard\": 1,\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Delivery Note\"\n ],\n \"doctype\": \"Delivery Note\",\n \"is_query_report\": true,\n \"label\": \"Delivery Note Trends\",\n \"name\": \"Delivery Note Trends\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Purchase Receipt\"\n ],\n \"doctype\": \"Purchase Receipt\",\n \"is_query_report\": true,\n \"label\": \"Purchase Receipt Trends\",\n \"name\": \"Purchase Receipt Trends\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Order Analysis\",\n \"name\": \"Sales Order Analysis\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Purchase Order\"\n ],\n \"doctype\": \"Purchase Order\",\n \"is_query_report\": true,\n \"label\": \"Purchase Order Analysis\",\n \"name\": \"Purchase Order Analysis\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Bin\"\n ],\n \"doctype\": \"Bin\",\n \"is_query_report\": true,\n \"label\": \"Item Shortage Report\",\n \"name\": \"Item Shortage Report\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Batch\"\n ],\n \"doctype\": \"Batch\",\n \"is_query_report\": true,\n \"label\": \"Batch-Wise Balance History\",\n \"name\": \"Batch-Wise Balance History\",\n \"type\": \"report\"\n }\n]" }, { "hidden": 0, @@ -58,7 +58,7 @@ "idx": 0, "is_standard": 1, "label": "Stock", - "modified": "2020-05-27 20:38:25.255323", + "modified": "2020-05-30 17:32:11.062681", "modified_by": "Administrator", "module": "Stock", "name": "Stock", diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.js b/erpnext/stock/doctype/stock_settings/stock_settings.js index 877d0c3bbf4..d5049ac6ed0 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.js +++ b/erpnext/stock/doctype/stock_settings/stock_settings.js @@ -20,7 +20,7 @@ frappe.tour['Stock Settings'] = [ { fieldname: "item_naming_by", title: __("Item Naming By"), - description: __("By default, the Item Name is set as per the Item Code entered. If you want Items to be named by a set Naming Series choose the 'Naming Series' option.") + description: __("By default, the Item Name is set as per the Item Code entered. If you want Items to be named by a") + "Naming Series" + __(" choose the 'Naming Series' option."), }, { fieldname: "default_warehouse", diff --git a/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py b/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py index 5a931e7efac..446d3049b71 100644 --- a/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py +++ b/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py @@ -26,9 +26,10 @@ def get_chart_data(data, filters): # consider only consolidated row data = [row for row in data if row[0]] + data = sorted(data, key = lambda i: i[-1],reverse=True) + if len(data) > 10: # get top 10 if data too long - data = sorted(data, key = lambda i: i[-1],reverse=True) data = data[:10] for row in data: diff --git a/erpnext/stock/report/ordered_items_to_be_delivered/__init__.py b/erpnext/stock/report/ordered_items_to_be_delivered/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json b/erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json deleted file mode 100644 index aa5fd0f165a..00000000000 --- a/erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "add_total_row": 1, - "creation": "2018-01-09 18:38:23.540100", - "disable_prepared_report": 0, - "disabled": 0, - "docstatus": 0, - "doctype": "Report", - "idx": 0, - "is_standard": "Yes", - "modified": "2019-04-01 22:10:09.829361", - "modified_by": "Administrator", - "module": "Stock", - "name": "Ordered Items To Be Delivered", - "owner": "Administrator", - "prepared_report": 0, - "query": "select \n `tabSales Order`.`name` as \"Sales Order:Link/Sales Order:120\",\n `tabSales Order`.`status` as \"Status:Data:120\",\n `tabSales Order`.`customer` as \"Customer:Link/Customer:120\",\n `tabSales Order`.`customer_name` as \"Customer Name::150\",\n `tabSales Order`.`transaction_date` as \"Date:Date\",\n `tabSales Order`.`project` as \"Project:Link/Project:120\",\n `tabSales Order Item`.item_code as \"Item:Link/Item:120\",\n `tabSales Order Item`.qty as \"Qty:Float:140\",\n `tabSales Order Item`.delivered_qty as \"Delivered Qty:Float:140\",\n (`tabSales Order Item`.qty - ifnull(`tabSales Order Item`.delivered_qty, 0)) as \"Qty to Deliver:Float:140\",\n `tabSales Order Item`.base_rate as \"Rate:Float:140\",\n `tabSales Order Item`.base_amount as \"Amount:Float:140\",\n ((`tabSales Order Item`.qty - ifnull(`tabSales Order Item`.delivered_qty, 0))*`tabSales Order Item`.base_rate) as \"Amount to Deliver:Float:140\",\n `tabBin`.actual_qty as \"Available Qty:Float:120\",\n `tabBin`.projected_qty as \"Projected Qty:Float:120\",\n `tabSales Order Item`.`delivery_date` as \"Item Delivery Date:Date:120\",\n DATEDIFF(CURDATE(),`tabSales Order Item`.`delivery_date`) as \"Delay Days:Int:120\",\n `tabSales Order Item`.item_name as \"Item Name::150\",\n `tabSales Order Item`.description as \"Description::200\",\n `tabSales Order Item`.item_group as \"Item Group:Link/Item Group:120\",\n `tabSales Order Item`.warehouse as \"Warehouse:Link/Warehouse:200\"\nfrom\n `tabSales Order` JOIN `tabSales Order Item` \n LEFT JOIN `tabBin` ON (`tabBin`.item_code = `tabSales Order Item`.item_code\n and `tabBin`.warehouse = `tabSales Order Item`.warehouse)\nwhere\n `tabSales Order Item`.`parent` = `tabSales Order`.`name`\n and `tabSales Order`.docstatus = 1\n and `tabSales Order`.status not in (\"Stopped\", \"Closed\")\n and ifnull(`tabSales Order Item`.delivered_qty,0) < ifnull(`tabSales Order Item`.qty,0)\norder by `tabSales Order`.transaction_date asc", - "ref_doctype": "Delivery Note", - "report_name": "Ordered Items To Be Delivered", - "report_type": "Query Report", - "roles": [ - { - "role": "Stock User" - }, - { - "role": "Stock Manager" - }, - { - "role": "Sales User" - }, - { - "role": "Accounts User" - } - ] -} \ No newline at end of file From aca2ca59828932a33ee1e4f029b28564f44cf648 Mon Sep 17 00:00:00 2001 From: Afshan Date: Fri, 19 Jun 2020 16:22:41 +0530 Subject: [PATCH 44/66] style: formate according to Codacy/PR Quality Review --- erpnext/public/js/controllers/taxes_and_totals.js | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index a449bdcca67..b72ceb21139 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -345,7 +345,6 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ tax.row_id = tax.idx - 1; } } - if(tax.charge_type == "Actual") { // distribute the tax amount proportionally to each item row var actual = flt(tax.tax_amount, precision("tax_amount", tax)); From aea450c36af7aa4b103e55f90e9cbe202d2ddede Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Fri, 19 Jun 2020 17:29:49 +0530 Subject: [PATCH 45/66] Revert "fix: update remark on submitting payment entry" --- erpnext/accounts/doctype/payment_entry/payment_entry.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 15e51bbd995..59611bc74c2 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -453,6 +453,8 @@ class PaymentEntry(AccountsController): frappe.throw(_("Reference No and Reference Date is mandatory for Bank transaction")) def set_remarks(self): + if self.remarks: return + if self.payment_type=="Internal Transfer": remarks = [_("Amount {0} {1} transferred from {2} to {3}") .format(self.paid_from_account_currency, self.paid_amount, self.paid_from, self.paid_to)] From fbd66574ad267370f0955d9d2a59beb447fb59a6 Mon Sep 17 00:00:00 2001 From: Afshan Date: Fri, 19 Jun 2020 18:17:01 +0530 Subject: [PATCH 46/66] Skiping total row for tree-view reports --- .../report/sales_analytics/sales_analytics.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/erpnext/selling/report/sales_analytics/sales_analytics.py b/erpnext/selling/report/sales_analytics/sales_analytics.py index 97d9322918d..cb5d3eccfdc 100644 --- a/erpnext/selling/report/sales_analytics/sales_analytics.py +++ b/erpnext/selling/report/sales_analytics/sales_analytics.py @@ -23,7 +23,14 @@ class Analytics(object): self.get_columns() self.get_data() self.get_chart_data() - return self.columns, self.data, None, self.chart + + # Skiping total row for tree-view reports + skip_total_row = 0 + + if self.filters.tree_type in ["Supplier Group", "Item Group", "Customer Group", "Territory"]: + skip_total_row = 1 + + return self.columns, self.data, None, self.chart, None, skip_total_row def get_columns(self): self.columns = [{ @@ -194,9 +201,6 @@ class Analytics(object): def get_rows(self): self.data = [] self.get_periodic_data() - total_row = { - "entity": "Total", - } for entity, period_data in iteritems(self.entity_periodic_data): row = { @@ -210,9 +214,6 @@ class Analytics(object): row[scrub(period)] = amount total += amount - if not total_row.get(scrub(period)): total_row[scrub(period)] = 0 - total_row[scrub(period)] += amount - row["total"] = total if self.filters.tree_type == "Item": @@ -220,8 +221,6 @@ class Analytics(object): self.data.append(row) - self.data.append(total_row) - def get_rows_by_group(self): self.get_periodic_data() out = [] From 65f00cea15d6d9e89a9123813c0f7fe72ee150c0 Mon Sep 17 00:00:00 2001 From: Afshan Date: Fri, 19 Jun 2020 18:19:06 +0530 Subject: [PATCH 47/66] fix: Skipping* --- erpnext/selling/report/sales_analytics/sales_analytics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/selling/report/sales_analytics/sales_analytics.py b/erpnext/selling/report/sales_analytics/sales_analytics.py index cb5d3eccfdc..4d113c8e9e9 100644 --- a/erpnext/selling/report/sales_analytics/sales_analytics.py +++ b/erpnext/selling/report/sales_analytics/sales_analytics.py @@ -24,7 +24,7 @@ class Analytics(object): self.get_data() self.get_chart_data() - # Skiping total row for tree-view reports + # Skipping total row for tree-view reports skip_total_row = 0 if self.filters.tree_type in ["Supplier Group", "Item Group", "Customer Group", "Territory"]: From 02f3e045ab9e0ff247ad84caff19d3ace528ece6 Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Fri, 19 Jun 2020 18:22:04 +0530 Subject: [PATCH 48/66] fix: due date filter in purchase invoice --- .../accounts/doctype/purchase_invoice/purchase_invoice_list.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js index 800ed921bdf..e9849c20502 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js @@ -16,7 +16,7 @@ frappe.listview_settings['Purchase Invoice'] = { } else if(frappe.datetime.get_diff(doc.due_date) < 0) { return [__("Overdue"), "red", "outstanding_amount,>,0|due_date,<,Today"]; } else { - return [__("Unpaid"), "orange", "outstanding_amount,>,0|due,>=,Today"]; + return [__("Unpaid"), "orange", "outstanding_amount,>,0|due_date,>=,Today"]; } } else if(cint(doc.is_return)) { return [__("Return"), "darkgrey", "is_return,=,Yes"]; @@ -25,3 +25,4 @@ frappe.listview_settings['Purchase Invoice'] = { } } }; +s \ No newline at end of file From 289c82243f32035043e804786c59594be32b2d10 Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Fri, 19 Jun 2020 19:17:57 +0530 Subject: [PATCH 49/66] feat: New Payroll module (#21990) * feat: Moved Document to Payroll Module * feat: Moved Reports to Payroll Module * feat: Moved Print fromat With Patch * feat: Moved Notifiction to Payroll Module and patches * feat: added dashboard and desk page to Payroll * feat: Payroll Dashboard * feat: Module onboarding * feat: Income tax Deductions Report * feat: Ecs Checklist Report * feat: Provident Fund Report * feat: Professional Fund report and commonified Code * feat: Total Payments Based On Payment Mode Report * fix: refactor and added chart Total Payments Based On Payment Mode * feat: Payroll Settings * fix: Bank remittance Report * feat(Payroll based on): Considered unmarked days * feat: Added Help for condition an formula in Salary structure * fix: requested changes * fix: rename report Ecs checklist to salary_payments_via_ecs * fix: renamed report report/total_payments_based_on_payment_mode * fix: added role via setup.py for regional report * feat: added All reports to desk page * fix: frappe.reload doc in all patches * fix: codacy * fix: frappe.reload_doctype for patches * patch: is_income_tax_component and component_type for salary component * fix: uncommented code * test: fixture * fix: test * test: test_payment_days_based_on_attendance --- .../doctype/journal_entry/journal_entry.js | 2 +- .../doctype/journal_entry/journal_entry.py | 2 +- erpnext/hr/dashboard_fixtures.py | 42 +- erpnext/hr/desk_page/hr/hr.json | 40 +- .../employee_benefit_application.json | 576 ----------------- .../employee_benefit_application_detail.json | 177 ------ .../employee_benefit_claim.json | 580 ------------------ .../test_employee_promotion.py | 2 +- .../employee_tax_exemption_category.json | 169 ----- ...ee_tax_exemption_declaration_category.json | 179 ------ ...employee_tax_exemption_proof_submission.py | 54 -- ...tax_exemption_proof_submission_detail.json | 213 ------- .../employee_tax_exemption_sub_category.json | 204 ------ erpnext/hr/doctype/hr_settings/hr_settings.js | 15 - .../hr/doctype/hr_settings/hr_settings.json | 145 ++--- erpnext/hr/doctype/hr_settings/hr_settings.py | 20 - .../leave_encashment/leave_encashment.py | 2 +- .../leave_encashment/test_leave_encashment.py | 2 +- .../payroll_employee_detail.json | 209 ------- .../payroll_period_date.json | 103 ---- .../salary_slip_timesheet.json | 107 ---- .../taxable_salary_slab.json | 232 ------- .../training_event/test_training_event.py | 2 +- .../salary_register/salary_register.json | 26 - .../loan_management/doctype/loan/test_loan.py | 2 +- .../loan_application/test_loan_application.py | 2 +- erpnext/modules.txt | 3 +- erpnext/patches.txt | 7 +- ...ate_department_records_for_each_company.py | 3 +- .../create_salary_structure_assignments.py | 6 +- .../v11_0/inter_state_field_for_gst.py | 4 +- .../v11_0/set_salary_component_properties.py | 4 +- .../patches/v11_1/rename_depends_on_lwp.py | 2 +- .../v13_0/check_is_income_tax_component.py | 24 + ...rts_and_notification_from_hr_to_payroll.py | 52 ++ ...oll_setting_separately_from_hr_settings.py | 27 + ..._from_payroll_period_to_income_tax_slab.py | 4 +- ...itional_salary_encashment_and_incentive.py | 6 +- ...custom_fields_for_india_specific_fields.py | 2 +- .../patches/v5_0/rename_table_fieldnames.py | 2 +- .../patches/v7_0/rename_salary_components.py | 4 +- erpnext/patches/v7_1/update_component_type.py | 2 +- .../update_missing_salary_component_type.py | 30 +- ...ar_leave_encashment_as_salary_component.py | 4 +- .../v7_2/update_abbr_in_salary_slips.py | 2 +- erpnext/patches/v7_2/update_salary_slips.py | 4 +- .../patches/v8_7/sync_india_custom_fields.py | 10 +- .../v9_0/update_employee_loan_details.py | 4 +- .../additional_salary => payroll}/__init__.py | 0 erpnext/payroll/dashboard_fixtures.py | 100 +++ .../payroll/desk_page/payroll/payroll.json | 84 +++ .../doctype}/__init__.py | 0 .../doctype/additional_salary}/__init__.py | 0 .../additional_salary/additional_salary.js | 0 .../additional_salary/additional_salary.json | 6 +- .../additional_salary/additional_salary.py | 0 .../test_additional_salary.js | 0 .../test_additional_salary.py | 4 +- .../employee_benefit_application}/__init__.py | 0 .../employee_benefit_application.js | 8 +- .../employee_benefit_application.json | 191 ++++++ .../employee_benefit_application.py | 4 +- .../test_employee_benefit_application.js | 0 .../test_employee_benefit_application.py | 0 .../__init__.py | 0 .../employee_benefit_application_detail.json | 58 ++ .../employee_benefit_application_detail.py | 4 +- .../employee_benefit_claim}/__init__.py | 0 .../employee_benefit_claim.js | 2 +- .../employee_benefit_claim.json | 194 ++++++ .../employee_benefit_claim.py | 6 +- .../test_employee_benefit_claim.js | 0 .../test_employee_benefit_claim.py | 0 .../doctype/employee_incentive}/__init__.py | 0 .../employee_incentive/employee_incentive.js | 0 .../employee_incentive.json | 4 +- .../employee_incentive/employee_incentive.py | 0 .../test_employee_incentive.js | 0 .../test_employee_incentive.py | 0 .../employee_other_income}/__init__.py | 0 .../employee_other_income.js | 0 .../employee_other_income.json | 4 +- .../employee_other_income.py | 0 .../test_employee_other_income.py | 0 .../__init__.py | 0 .../employee_tax_exemption_category.js | 0 .../employee_tax_exemption_category.json | 74 +++ .../employee_tax_exemption_category.py | 0 .../test_employee_tax_exemption_category.js | 0 .../test_employee_tax_exemption_category.py | 0 .../__init__.py | 0 .../employee_tax_exemption_declaration.js | 2 +- .../employee_tax_exemption_declaration.json | 4 +- .../employee_tax_exemption_declaration.py | 0 ...test_employee_tax_exemption_declaration.js | 0 ...test_employee_tax_exemption_declaration.py | 0 .../__init__.py | 0 ...ee_tax_exemption_declaration_category.json | 61 ++ ...oyee_tax_exemption_declaration_category.py | 4 +- .../__init__.py | 0 ...employee_tax_exemption_proof_submission.js | 2 +- ...ployee_tax_exemption_proof_submission.json | 4 +- ...employee_tax_exemption_proof_submission.py | 0 ...employee_tax_exemption_proof_submission.js | 0 ...employee_tax_exemption_proof_submission.py | 54 ++ .../__init__.py | 0 ...tax_exemption_proof_submission_detail.json | 66 ++ ...e_tax_exemption_proof_submission_detail.py | 4 +- .../__init__.py | 0 .../employee_tax_exemption_sub_category.js | 0 .../employee_tax_exemption_sub_category.json | 86 +++ .../employee_tax_exemption_sub_category.py | 0 ...est_employee_tax_exemption_sub_category.js | 0 ...est_employee_tax_exemption_sub_category.py | 0 .../doctype/income_tax_slab}/__init__.py | 0 .../income_tax_slab/income_tax_slab.js | 0 .../income_tax_slab/income_tax_slab.json | 4 +- .../income_tax_slab/income_tax_slab.py | 0 .../income_tax_slab/test_income_tax_slab.py | 0 .../__init__.py | 0 .../income_tax_slab_other_charges.json | 28 +- .../income_tax_slab_other_charges.py | 0 .../payroll_employee_detail}/__init__.py | 0 .../payroll_employee_detail.json | 66 ++ .../payroll_employee_detail.py | 0 .../doctype/payroll_entry}/__init__.py | 0 .../doctype/payroll_entry/payroll_entry.js | 6 +- .../doctype/payroll_entry/payroll_entry.json | 6 +- .../doctype/payroll_entry/payroll_entry.py | 8 +- .../payroll_entry/payroll_entry_dashboard.py | 0 .../payroll_entry/test_payroll_entry.js | 0 .../payroll_entry/test_payroll_entry.py | 8 +- .../test_set_salary_components.js | 0 .../doctype/payroll_period}/__init__.py | 0 .../doctype/payroll_period/payroll_period.js | 0 .../payroll_period/payroll_period.json | 4 +- .../doctype/payroll_period/payroll_period.py | 2 +- .../payroll_period_dashboard.py | 0 .../payroll_period/test_payroll_period.js | 0 .../payroll_period/test_payroll_period.py | 0 .../doctype/payroll_period_date}/__init__.py | 0 .../payroll_period_date.json | 39 ++ .../payroll_period_date.py | 4 +- .../doctype/payroll_settings}/__init__.py | 0 .../payroll_settings/payroll_settings.js | 19 + .../payroll_settings/payroll_settings.json | 130 ++++ .../payroll_settings/payroll_settings.py | 32 + .../payroll_settings/test_payroll_settings.py | 10 + .../doctype/retention_bonus}/__init__.py | 0 .../retention_bonus/retention_bonus.js | 0 .../retention_bonus/retention_bonus.json | 17 +- .../retention_bonus/retention_bonus.py | 29 +- .../retention_bonus/test_retention_bonus.js | 0 .../retention_bonus/test_retention_bonus.py | 0 .../doctype/salary_component/README.md | 0 .../doctype/salary_component}/__init__.py | 0 .../salary_component/salary_component.js | 0 .../salary_component/salary_component.json | 14 +- .../salary_component/salary_component.py | 0 .../salary_component/test_records.json | 0 .../salary_component/test_salary_component.js | 0 .../salary_component/test_salary_component.py | 0 .../doctype/salary_detail}/__init__.py | 0 .../doctype/salary_detail/salary_detail.json | 6 +- .../doctype/salary_detail/salary_detail.py | 0 .../doctype/salary_slip/README.md | 0 .../doctype/salary_slip/__init__.py | 0 .../doctype/salary_slip/salary_slip.js | 5 +- .../doctype/salary_slip/salary_slip.json | 255 ++++++-- .../doctype/salary_slip/salary_slip.py | 100 ++- .../doctype/salary_slip/salary_slip_list.js | 0 .../doctype/salary_slip/test_salary_slip.js | 0 .../doctype/salary_slip/test_salary_slip.py | 41 +- .../salary_slip_timesheet}/__init__.py | 0 .../salary_slip_timesheet.json | 40 ++ .../salary_slip_timesheet.py | 4 +- .../doctype/salary_structure/README.md | 0 .../doctype/salary_structure/__init__.py | 0 .../condition_and_formula_help.html | 47 ++ .../salary_structure/salary_structure.js | 29 +- .../salary_structure/salary_structure.json | 130 ++-- .../salary_structure/salary_structure.py | 0 .../salary_structure_dashboard.py | 0 .../salary_structure/test_salary_structure.js | 0 .../salary_structure/test_salary_structure.py | 10 +- .../salary_structure_assignment}/__init__.py | 0 .../salary_structure_assignment.js | 0 .../salary_structure_assignment.json | 4 +- .../salary_structure_assignment.py | 0 .../test_salary_structure_assignment.js | 0 .../test_salary_structure_assignment.py | 0 .../doctype/taxable_salary_slab}/__init__.py | 0 .../taxable_salary_slab.json | 64 ++ .../taxable_salary_slab.py | 4 +- .../module_onboarding/payroll/payroll.json | 51 ++ erpnext/payroll/notification/as | 1 + .../notification/retention_bonus}/__init__.py | 0 .../retention_bonus/retention_bonus.json | 6 +- .../retention_bonus/retention_bonus.md | 0 .../retention_bonus/retention_bonus.py | 0 .../assign_salary_structure.json | 19 + .../create_employee/create_employee.json | 19 + .../create_income_tax_slab.json | 19 + .../create_payroll_period.json | 19 + .../create_salary_component.json | 19 + .../create_salary_slip.json | 19 + .../create_salary_structure.json | 19 + .../payroll_settings/payroll_settings.json | 19 + .../__init__.py | 0 .../salary_slip_based_on_timesheet.json | 0 .../salary_slip_standard/__init__.py | 0 .../salary_slip_standard.json | 0 erpnext/payroll/report/__init__.py | 0 .../report/bank_remittance/__init__.py | 0 .../report/bank_remittance/bank_remittance.js | 12 +- .../bank_remittance/bank_remittance.json | 4 +- .../report/bank_remittance/bank_remittance.py | 5 +- .../report/income_tax_deductions/__init__.py | 0 .../income_tax_deductions.js | 7 + .../income_tax_deductions.json | 30 + .../income_tax_deductions.py | 127 ++++ .../__init__.py | 0 .../salary_payments_based_on_payment_mode.js | 7 + ...salary_payments_based_on_payment_mode.json | 30 + .../salary_payments_based_on_payment_mode.py | 177 ++++++ .../salary_payments_via_ecs/__init__.py | 0 .../salary_payments_via_ecs.js | 16 + .../salary_payments_via_ecs.json | 27 + .../salary_payments_via_ecs.py | 146 +++++ .../report/salary_register/__init__.py | 0 .../salary_register/salary_register.html | 0 .../report/salary_register/salary_register.js | 0 .../salary_register/salary_register.json | 27 + .../report/salary_register/salary_register.py | 4 +- .../doctype/timesheet/test_timesheet.py | 2 +- .../salary_slip_deductions_report_filters.js | 47 ++ erpnext/regional/india/setup.py | 54 +- erpnext/regional/india/utils.py | 2 +- .../professional_tax_deductions/__init__.py | 0 .../professional_tax_deductions.js | 7 + .../professional_tax_deductions.json | 20 + .../professional_tax_deductions.py | 69 +++ .../provident_fund_deductions/__init__.py | 0 .../provident_fund_deductions.js | 7 + .../provident_fund_deductions.json | 20 + .../provident_fund_deductions.py | 153 +++++ .../operations/install_fixtures.py | 2 +- 247 files changed, 3360 insertions(+), 3360 deletions(-) delete mode 100644 erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json delete mode 100644 erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json delete mode 100644 erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json delete mode 100644 erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json delete mode 100644 erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json delete mode 100644 erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py delete mode 100644 erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json delete mode 100644 erpnext/hr/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json delete mode 100644 erpnext/hr/doctype/payroll_employee_detail/payroll_employee_detail.json delete mode 100644 erpnext/hr/doctype/payroll_period_date/payroll_period_date.json delete mode 100644 erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.json delete mode 100644 erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.json delete mode 100644 erpnext/hr/report/salary_register/salary_register.json create mode 100644 erpnext/patches/v13_0/check_is_income_tax_component.py create mode 100644 erpnext/patches/v13_0/move_doctype_reports_and_notification_from_hr_to_payroll.py create mode 100644 erpnext/patches/v13_0/move_payroll_setting_separately_from_hr_settings.py rename erpnext/{hr/doctype/additional_salary => payroll}/__init__.py (100%) create mode 100644 erpnext/payroll/dashboard_fixtures.py create mode 100644 erpnext/payroll/desk_page/payroll/payroll.json rename erpnext/{hr/doctype/employee_benefit_application => payroll/doctype}/__init__.py (100%) rename erpnext/{hr/doctype/employee_benefit_application_detail => payroll/doctype/additional_salary}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/additional_salary/additional_salary.js (100%) rename erpnext/{hr => payroll}/doctype/additional_salary/additional_salary.json (98%) rename erpnext/{hr => payroll}/doctype/additional_salary/additional_salary.py (100%) rename erpnext/{hr => payroll}/doctype/additional_salary/test_additional_salary.js (100%) rename erpnext/{hr => payroll}/doctype/additional_salary/test_additional_salary.py (87%) rename erpnext/{hr/doctype/employee_benefit_claim => payroll/doctype/employee_benefit_application}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/employee_benefit_application/employee_benefit_application.js (83%) create mode 100644 erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.json rename erpnext/{hr => payroll}/doctype/employee_benefit_application/employee_benefit_application.py (97%) rename erpnext/{hr => payroll}/doctype/employee_benefit_application/test_employee_benefit_application.js (100%) rename erpnext/{hr => payroll}/doctype/employee_benefit_application/test_employee_benefit_application.py (100%) rename erpnext/{hr/doctype/employee_incentive => payroll/doctype/employee_benefit_application_detail}/__init__.py (100%) create mode 100644 erpnext/payroll/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json rename erpnext/{hr => payroll}/doctype/employee_benefit_application_detail/employee_benefit_application_detail.py (73%) rename erpnext/{hr/doctype/employee_other_income => payroll/doctype/employee_benefit_claim}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/employee_benefit_claim/employee_benefit_claim.js (77%) create mode 100644 erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.json rename erpnext/{hr => payroll}/doctype/employee_benefit_claim/employee_benefit_claim.py (96%) rename erpnext/{hr => payroll}/doctype/employee_benefit_claim/test_employee_benefit_claim.js (100%) rename erpnext/{hr => payroll}/doctype/employee_benefit_claim/test_employee_benefit_claim.py (100%) rename erpnext/{hr/doctype/employee_tax_exemption_category => payroll/doctype/employee_incentive}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/employee_incentive/employee_incentive.js (100%) rename erpnext/{hr => payroll}/doctype/employee_incentive/employee_incentive.json (97%) rename erpnext/{hr => payroll}/doctype/employee_incentive/employee_incentive.py (100%) rename erpnext/{hr => payroll}/doctype/employee_incentive/test_employee_incentive.js (100%) rename erpnext/{hr => payroll}/doctype/employee_incentive/test_employee_incentive.py (100%) rename erpnext/{hr/doctype/employee_tax_exemption_declaration => payroll/doctype/employee_other_income}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/employee_other_income/employee_other_income.js (100%) rename erpnext/{hr => payroll}/doctype/employee_other_income/employee_other_income.json (97%) rename erpnext/{hr => payroll}/doctype/employee_other_income/employee_other_income.py (100%) rename erpnext/{hr => payroll}/doctype/employee_other_income/test_employee_other_income.py (100%) rename erpnext/{hr/doctype/employee_tax_exemption_declaration_category => payroll/doctype/employee_tax_exemption_category}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_category/employee_tax_exemption_category.js (100%) create mode 100644 erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_category/employee_tax_exemption_category.py (100%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.js (100%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py (100%) rename erpnext/{hr/doctype/employee_tax_exemption_proof_submission => payroll/doctype/employee_tax_exemption_declaration}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.js (88%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json (98%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py (100%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.js (100%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py (100%) rename erpnext/{hr/doctype/employee_tax_exemption_proof_submission_detail => payroll/doctype/employee_tax_exemption_declaration_category}/__init__.py (100%) create mode 100644 erpnext/payroll/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.py (73%) rename erpnext/{hr/doctype/employee_tax_exemption_sub_category => payroll/doctype/employee_tax_exemption_proof_submission}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.js (90%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json (98%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py (100%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.js (100%) create mode 100644 erpnext/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py rename erpnext/{hr/doctype/income_tax_slab => payroll/doctype/employee_tax_exemption_proof_submission_detail}/__init__.py (100%) create mode 100644 erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.py (74%) rename erpnext/{hr/doctype/income_tax_slab_other_charges => payroll/doctype/employee_tax_exemption_sub_category}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.js (100%) create mode 100644 erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.py (100%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.js (100%) rename erpnext/{hr => payroll}/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.py (100%) rename erpnext/{hr/doctype/payroll_employee_detail => payroll/doctype/income_tax_slab}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/income_tax_slab/income_tax_slab.js (100%) rename erpnext/{hr => payroll}/doctype/income_tax_slab/income_tax_slab.json (97%) rename erpnext/{hr => payroll}/doctype/income_tax_slab/income_tax_slab.py (100%) rename erpnext/{hr => payroll}/doctype/income_tax_slab/test_income_tax_slab.py (100%) rename erpnext/{hr/doctype/payroll_entry => payroll/doctype/income_tax_slab_other_charges}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.json (95%) rename erpnext/{hr => payroll}/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.py (100%) rename erpnext/{hr/doctype/payroll_period => payroll/doctype/payroll_employee_detail}/__init__.py (100%) create mode 100644 erpnext/payroll/doctype/payroll_employee_detail/payroll_employee_detail.json rename erpnext/{hr => payroll}/doctype/payroll_employee_detail/payroll_employee_detail.py (100%) rename erpnext/{hr/doctype/payroll_period_date => payroll/doctype/payroll_entry}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/payroll_entry/payroll_entry.js (95%) rename erpnext/{hr => payroll}/doctype/payroll_entry/payroll_entry.json (98%) rename erpnext/{hr => payroll}/doctype/payroll_entry/payroll_entry.py (99%) rename erpnext/{hr => payroll}/doctype/payroll_entry/payroll_entry_dashboard.py (100%) rename erpnext/{hr => payroll}/doctype/payroll_entry/test_payroll_entry.js (100%) rename erpnext/{hr => payroll}/doctype/payroll_entry/test_payroll_entry.py (96%) rename erpnext/{hr => payroll}/doctype/payroll_entry/test_set_salary_components.js (100%) rename erpnext/{hr/doctype/retention_bonus => payroll/doctype/payroll_period}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/payroll_period/payroll_period.js (100%) rename erpnext/{hr => payroll}/doctype/payroll_period/payroll_period.json (96%) rename erpnext/{hr => payroll}/doctype/payroll_period/payroll_period.py (97%) rename erpnext/{hr => payroll}/doctype/payroll_period/payroll_period_dashboard.py (100%) rename erpnext/{hr => payroll}/doctype/payroll_period/test_payroll_period.js (100%) rename erpnext/{hr => payroll}/doctype/payroll_period/test_payroll_period.py (100%) rename erpnext/{hr/doctype/salary_component => payroll/doctype/payroll_period_date}/__init__.py (100%) create mode 100644 erpnext/payroll/doctype/payroll_period_date/payroll_period_date.json rename erpnext/{hr => payroll}/doctype/payroll_period_date/payroll_period_date.py (71%) rename erpnext/{hr/doctype/salary_detail => payroll/doctype/payroll_settings}/__init__.py (100%) create mode 100644 erpnext/payroll/doctype/payroll_settings/payroll_settings.js create mode 100644 erpnext/payroll/doctype/payroll_settings/payroll_settings.json create mode 100644 erpnext/payroll/doctype/payroll_settings/payroll_settings.py create mode 100644 erpnext/payroll/doctype/payroll_settings/test_payroll_settings.py rename erpnext/{hr/doctype/salary_slip_timesheet => payroll/doctype/retention_bonus}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/retention_bonus/retention_bonus.js (100%) rename erpnext/{hr => payroll}/doctype/retention_bonus/retention_bonus.json (90%) rename erpnext/{hr => payroll}/doctype/retention_bonus/retention_bonus.py (76%) rename erpnext/{hr => payroll}/doctype/retention_bonus/test_retention_bonus.js (100%) rename erpnext/{hr => payroll}/doctype/retention_bonus/test_retention_bonus.py (100%) rename erpnext/{hr => payroll}/doctype/salary_component/README.md (100%) rename erpnext/{hr/doctype/salary_structure_assignment => payroll/doctype/salary_component}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/salary_component/salary_component.js (100%) rename erpnext/{hr => payroll}/doctype/salary_component/salary_component.json (95%) rename erpnext/{hr => payroll}/doctype/salary_component/salary_component.py (100%) rename erpnext/{hr => payroll}/doctype/salary_component/test_records.json (100%) rename erpnext/{hr => payroll}/doctype/salary_component/test_salary_component.js (100%) rename erpnext/{hr => payroll}/doctype/salary_component/test_salary_component.py (100%) rename erpnext/{hr/doctype/taxable_salary_slab => payroll/doctype/salary_detail}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/salary_detail/salary_detail.json (99%) rename erpnext/{hr => payroll}/doctype/salary_detail/salary_detail.py (100%) rename erpnext/{hr => payroll}/doctype/salary_slip/README.md (100%) rename erpnext/{hr => payroll}/doctype/salary_slip/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/salary_slip/salary_slip.js (93%) rename erpnext/{hr => payroll}/doctype/salary_slip/salary_slip.json (70%) rename erpnext/{hr => payroll}/doctype/salary_slip/salary_slip.py (92%) rename erpnext/{hr => payroll}/doctype/salary_slip/salary_slip_list.js (100%) rename erpnext/{hr => payroll}/doctype/salary_slip/test_salary_slip.js (100%) rename erpnext/{hr => payroll}/doctype/salary_slip/test_salary_slip.py (94%) rename erpnext/{hr/notification/retention_bonus => payroll/doctype/salary_slip_timesheet}/__init__.py (100%) create mode 100644 erpnext/payroll/doctype/salary_slip_timesheet/salary_slip_timesheet.json rename erpnext/{hr => payroll}/doctype/salary_slip_timesheet/salary_slip_timesheet.py (72%) rename erpnext/{hr => payroll}/doctype/salary_structure/README.md (100%) rename erpnext/{hr => payroll}/doctype/salary_structure/__init__.py (100%) create mode 100644 erpnext/payroll/doctype/salary_structure/condition_and_formula_help.html rename erpnext/{hr => payroll}/doctype/salary_structure/salary_structure.js (91%) rename erpnext/{hr => payroll}/doctype/salary_structure/salary_structure.json (71%) rename erpnext/{hr => payroll}/doctype/salary_structure/salary_structure.py (100%) rename erpnext/{hr => payroll}/doctype/salary_structure/salary_structure_dashboard.py (100%) rename erpnext/{hr => payroll}/doctype/salary_structure/test_salary_structure.js (100%) rename erpnext/{hr => payroll}/doctype/salary_structure/test_salary_structure.py (94%) rename erpnext/{hr/print_format/salary_slip_based_on_timesheet => payroll/doctype/salary_structure_assignment}/__init__.py (100%) rename erpnext/{hr => payroll}/doctype/salary_structure_assignment/salary_structure_assignment.js (100%) rename erpnext/{hr => payroll}/doctype/salary_structure_assignment/salary_structure_assignment.json (98%) rename erpnext/{hr => payroll}/doctype/salary_structure_assignment/salary_structure_assignment.py (100%) rename erpnext/{hr => payroll}/doctype/salary_structure_assignment/test_salary_structure_assignment.js (100%) rename erpnext/{hr => payroll}/doctype/salary_structure_assignment/test_salary_structure_assignment.py (100%) rename erpnext/{hr/print_format/salary_slip_standard => payroll/doctype/taxable_salary_slab}/__init__.py (100%) create mode 100644 erpnext/payroll/doctype/taxable_salary_slab/taxable_salary_slab.json rename erpnext/{hr => payroll}/doctype/taxable_salary_slab/taxable_salary_slab.py (71%) create mode 100644 erpnext/payroll/module_onboarding/payroll/payroll.json create mode 100644 erpnext/payroll/notification/as rename erpnext/{hr/report/bank_remittance => payroll/notification/retention_bonus}/__init__.py (100%) rename erpnext/{hr => payroll}/notification/retention_bonus/retention_bonus.json (86%) rename erpnext/{hr => payroll}/notification/retention_bonus/retention_bonus.md (100%) rename erpnext/{hr => payroll}/notification/retention_bonus/retention_bonus.py (100%) create mode 100644 erpnext/payroll/onboarding_step/assign_salary_structure/assign_salary_structure.json create mode 100644 erpnext/payroll/onboarding_step/create_employee/create_employee.json create mode 100644 erpnext/payroll/onboarding_step/create_income_tax_slab/create_income_tax_slab.json create mode 100644 erpnext/payroll/onboarding_step/create_payroll_period/create_payroll_period.json create mode 100644 erpnext/payroll/onboarding_step/create_salary_component/create_salary_component.json create mode 100644 erpnext/payroll/onboarding_step/create_salary_slip/create_salary_slip.json create mode 100644 erpnext/payroll/onboarding_step/create_salary_structure/create_salary_structure.json create mode 100644 erpnext/payroll/onboarding_step/payroll_settings/payroll_settings.json rename erpnext/{hr/report/salary_register => payroll/print_format/salary_slip_based_on_timesheet}/__init__.py (100%) rename erpnext/{hr => payroll}/print_format/salary_slip_based_on_timesheet/salary_slip_based_on_timesheet.json (100%) create mode 100644 erpnext/payroll/print_format/salary_slip_standard/__init__.py rename erpnext/{hr => payroll}/print_format/salary_slip_standard/salary_slip_standard.json (100%) create mode 100644 erpnext/payroll/report/__init__.py create mode 100644 erpnext/payroll/report/bank_remittance/__init__.py rename erpnext/{hr => payroll}/report/bank_remittance/bank_remittance.js (68%) rename erpnext/{hr => payroll}/report/bank_remittance/bank_remittance.json (87%) rename erpnext/{hr => payroll}/report/bank_remittance/bank_remittance.py (96%) create mode 100644 erpnext/payroll/report/income_tax_deductions/__init__.py create mode 100644 erpnext/payroll/report/income_tax_deductions/income_tax_deductions.js create mode 100644 erpnext/payroll/report/income_tax_deductions/income_tax_deductions.json create mode 100644 erpnext/payroll/report/income_tax_deductions/income_tax_deductions.py create mode 100644 erpnext/payroll/report/salary_payments_based_on_payment_mode/__init__.py create mode 100644 erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.js create mode 100644 erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.json create mode 100644 erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.py create mode 100644 erpnext/payroll/report/salary_payments_via_ecs/__init__.py create mode 100644 erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.js create mode 100644 erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.json create mode 100644 erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py create mode 100644 erpnext/payroll/report/salary_register/__init__.py rename erpnext/{hr => payroll}/report/salary_register/salary_register.html (100%) rename erpnext/{hr => payroll}/report/salary_register/salary_register.js (100%) create mode 100644 erpnext/payroll/report/salary_register/salary_register.json rename erpnext/{hr => payroll}/report/salary_register/salary_register.py (96%) create mode 100644 erpnext/public/js/salary_slip_deductions_report_filters.js create mode 100644 erpnext/regional/report/professional_tax_deductions/__init__.py create mode 100644 erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.js create mode 100644 erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.json create mode 100644 erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.py create mode 100644 erpnext/regional/report/provident_fund_deductions/__init__.py create mode 100644 erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.js create mode 100644 erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.json create mode 100644 erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.py diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 9a832e3c1fe..5685f839fe8 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -278,7 +278,7 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ // payroll entry if(jvd.reference_type==="Payroll Entry") { return { - query: "erpnext.hr.doctype.payroll_entry.payroll_entry.get_payroll_entries_for_jv", + query: "erpnext.payroll.doctype.payroll_entry.payroll_entry.get_payroll_entries_for_jv", }; } diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 41922a2a694..caaf30f11fb 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -54,7 +54,7 @@ class JournalEntry(AccountsController): def on_cancel(self): from erpnext.accounts.utils import unlink_ref_doc_from_payment_entries - from erpnext.hr.doctype.salary_slip.salary_slip import unlink_ref_doc_from_salary_slip + from erpnext.payroll.doctype.salary_slip.salary_slip import unlink_ref_doc_from_salary_slip unlink_ref_doc_from_payment_entries(self) unlink_ref_doc_from_salary_slip(self.name) self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry') diff --git a/erpnext/hr/dashboard_fixtures.py b/erpnext/hr/dashboard_fixtures.py index 6e042ac78d3..6d8091be647 100644 --- a/erpnext/hr/dashboard_fixtures.py +++ b/erpnext/hr/dashboard_fixtures.py @@ -24,24 +24,19 @@ def get_human_resource_dashboard(): "dashboard_name": "Human Resource", "is_default": 1, "charts": [ - { "chart": "Outgoing Salary", "width": "Full"}, + { "chart": "Attendance Count", "width": "Full"}, { "chart": "Gender Diversity Ratio", "width": "Half"}, { "chart": "Job Application Status", "width": "Half"}, { "chart": 'Designation Wise Employee Count', "width": "Half"}, { "chart": 'Department Wise Employee Count', "width": "Half"}, { "chart": 'Designation Wise Openings', "width": "Half"}, - { "chart": 'Department Wise Openings', "width": "Half"}, - { "chart": "Attendance Count", "width": "Full"} + { "chart": 'Department Wise Openings', "width": "Half"} ], "cards": [ {"card": "Total Employees"}, {"card": "New Joinees (Last year)"}, {'card': "Employees Left (Last year)"}, - {'card': "Total Job Openings (Last month)"}, {'card': "Total Applicants (Last month)"}, - {'card': "Shortlisted Candidates (Last month)"}, - {'card': "Rejected Candidates (Last month)"}, - {'card': "Total Job Offered (Last month)"}, ] } @@ -71,13 +66,6 @@ def get_charts(): filters_json = json.dumps([["Job Applicant", "creation", "Previous", "1 month"]])) ) - dashboard_charts.append( - get_dashboards_chart_doc('Outgoing Salary', "Sum", "Line", - document_type = "Salary Slip", based_on="end_date", - value_based_on = "rounded_total", time_interval = "Monthly", timeseries = 1, - filters_json = json.dumps([["Salary Slip", "docstatus", "=", 1]])) - ) - custom_options = '''{ "type": "line", "axisOptions": { @@ -156,32 +144,6 @@ def get_number_cards(): ) ) - number_cards.append( - get_number_cards_doc("Job Opening", "Total Job Openings (Last month)", func = "Sum", - aggregate_function_based_on = "planned_vacancies", - filters_json = json.dumps([["Job Opening", "creation", "Previous", "1 month"]]) - ) - ) - number_cards.append( - get_number_cards_doc("Job Applicant", "Shortlisted Candidates (Last month)", filters_json = json.dumps([ - ["Job Applicant", "status", "=", "Accepted"], - ["Job Applicant", "creation", "Previous", "1 month"] - ]) - ) - ) - number_cards.append( - get_number_cards_doc("Job Applicant", "Rejected Candidates (Last month)", filters_json = json.dumps([ - ["Job Applicant", "status", "=", "Rejected"], - ["Job Applicant", "creation", "Previous", "1 month"] - ]) - ) - ) - number_cards.append( - get_number_cards_doc("Job Offer", "Total Job Offered (Last month)", - filters_json = json.dumps([["Job Offer", "creation", "Previous", "1 month"]]) - ) - ) - return number_cards diff --git a/erpnext/hr/desk_page/hr/hr.json b/erpnext/hr/desk_page/hr/hr.json index 12548d48a74..0fed8d322f5 100644 --- a/erpnext/hr/desk_page/hr/hr.json +++ b/erpnext/hr/desk_page/hr/hr.json @@ -20,11 +20,6 @@ "label": "Leaves", "links": "[\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Leave Application\",\n \"name\": \"Leave Application\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Leave Allocation\",\n \"name\": \"Leave Allocation\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Leave Type\"\n ],\n \"label\": \"Leave Policy\",\n \"name\": \"Leave Policy\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Leave Period\",\n \"name\": \"Leave Period\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Leave Type\",\n \"name\": \"Leave Type\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Holiday List\",\n \"name\": \"Holiday List\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Compensatory Leave Request\",\n \"name\": \"Compensatory Leave Request\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Leave Encashment\",\n \"name\": \"Leave Encashment\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Leave Block List\",\n \"name\": \"Leave Block List\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Leave Application\"\n ],\n \"doctype\": \"Leave Application\",\n \"is_query_report\": true,\n \"label\": \"Employee Leave Balance\",\n \"name\": \"Employee Leave Balance\",\n \"type\": \"report\"\n }\n]" }, - { - "hidden": 0, - "label": "Payroll", - "links": "[\n {\n \"label\": \"Salary Structure\",\n \"name\": \"Salary Structure\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Salary Structure\",\n \"Employee\"\n ],\n \"label\": \"Salary Structure Assignment\",\n \"name\": \"Salary Structure Assignment\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Payroll Entry\",\n \"name\": \"Payroll Entry\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Salary Slip\",\n \"name\": \"Salary Slip\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Payroll Period\",\n \"name\": \"Payroll Period\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Income Tax Slab\",\n \"name\": \"Income Tax Slab\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Salary Component\",\n \"name\": \"Salary Component\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Additional Salary\",\n \"name\": \"Additional Salary\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Retention Bonus\",\n \"name\": \"Retention Bonus\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Employee Incentive\",\n \"name\": \"Employee Incentive\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Salary Slip\"\n ],\n \"doctype\": \"Salary Slip\",\n \"is_query_report\": true,\n \"label\": \"Salary Register\",\n \"name\": \"Salary Register\",\n \"type\": \"report\"\n }\n]" - }, { "hidden": 0, "label": "Attendance", @@ -50,11 +45,6 @@ "label": "Recruitment", "links": "[\n {\n \"label\": \"Job Opening\",\n \"name\": \"Job Opening\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Job Applicant\",\n \"name\": \"Job Applicant\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Job Offer\",\n \"name\": \"Job Offer\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Staffing Plan\",\n \"name\": \"Staffing Plan\",\n \"type\": \"doctype\"\n }\n]" }, - { - "hidden": 0, - "label": "Loans", - "links": "[\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Loan Application\",\n \"name\": \"Loan Application\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Loan\",\n \"name\": \"Loan\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Loan Type\",\n \"name\": \"Loan Type\",\n \"type\": \"doctype\"\n }\n]" - }, { "hidden": 0, "label": "Training", @@ -69,18 +59,13 @@ "hidden": 0, "label": "Performance", "links": "[\n {\n \"label\": \"Appraisal\",\n \"name\": \"Appraisal\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Appraisal Template\",\n \"name\": \"Appraisal Template\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Energy Point Rule\",\n \"name\": \"Energy Point Rule\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Energy Point Log\",\n \"name\": \"Energy Point Log\",\n \"type\": \"doctype\"\n }\n]" - }, - { - "hidden": 0, - "label": "Employee Tax and Benefits", - "links": "[\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Employee Tax Exemption Declaration\",\n \"name\": \"Employee Tax Exemption Declaration\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Employee Tax Exemption Proof Submission\",\n \"name\": \"Employee Tax Exemption Proof Submission\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Employee\",\n \"Payroll Period\"\n ],\n \"label\": \"Employee Other Income\",\n \"name\": \"Employee Other Income\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Employee Benefit Application\",\n \"name\": \"Employee Benefit Application\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Employee Benefit Claim\",\n \"name\": \"Employee Benefit Claim\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Employee Tax Exemption Category\",\n \"name\": \"Employee Tax Exemption Category\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Employee\"\n ],\n \"label\": \"Employee Tax Exemption Sub Category\",\n \"name\": \"Employee Tax Exemption Sub Category\",\n \"type\": \"doctype\"\n }\n]" } ], "category": "Modules", "charts": [ { - "chart_name": "Outgoing Salary", - "label": "Outgoing Salary" + "chart_name": "Attendance Count", + "label": "Attendance Count" } ], "creation": "2020-03-02 15:48:58.322521", @@ -103,21 +88,13 @@ "pin_to_top": 0, "shortcuts": [ { - "color": "#cef6d1", + "color": "#9deca2", "format": "{} Active", "label": "Employee", "link_to": "Employee", "stats_filter": "{\"status\":\"Active\"}", "type": "DocType" }, - { - "color": "#ffe8cd", - "format": "{} Open", - "label": "Leave Application", - "link_to": "Leave Application", - "stats_filter": "{\"status\":\"Open\"}", - "type": "DocType" - }, { "label": "Attendance", "link_to": "Attendance", @@ -125,8 +102,15 @@ "type": "DocType" }, { - "label": "Salary Structure", - "link_to": "Salary Structure", + "format": "{} Open", + "label": "Leave Application", + "link_to": "Leave Application", + "stats_filter": "{\"status\":\"Open\"}", + "type": "DocType" + }, + { + "label": "Job Applicant", + "link_to": "Job Applicant", "type": "DocType" }, { diff --git a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json deleted file mode 100644 index cf624195b78..00000000000 --- a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.json +++ /dev/null @@ -1,576 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 1, - "autoname": "HR-BEN-APP-.YY.-.MM.-.#####", - "beta": 0, - "creation": "2018-04-13 16:31:39.190787", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "employee", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Employee", - "length": 0, - "no_copy": 0, - "options": "Employee", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "employee.employee_name", - "fieldname": "employee_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Employee Name", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "max_benefits", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Max Benefits (Yearly)", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "remaining_benefit", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Remaining Benefits (Yearly)", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Today", - "fieldname": "date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "payroll_period", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Payroll Period", - "length": 0, - "no_copy": 0, - "options": "Payroll Period", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "employee.department", - "fieldname": "department", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Department", - "length": 0, - "no_copy": 0, - "options": "Department", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "options": "Employee Benefit Application", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_4", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Benefits Applied", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "employee_benefits", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Employee Benefits", - "length": 0, - "no_copy": 0, - "options": "Employee Benefit Application Detail", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "totals", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Totals", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "total_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Total Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "pro_rata_dispensed_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Dispensed Amount (Pro-rated)", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-08-21 16:15:39.714081", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Benefit Application", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - }, - { - "amend": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - }, - { - "amend": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Employee", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "title_field": "employee_name", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json b/erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json deleted file mode 100644 index 56421db8c32..00000000000 --- a/erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json +++ /dev/null @@ -1,177 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "", - "beta": 0, - "creation": "2018-04-13 16:36:18.389786", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "earning_component", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Earning Component", - "length": 0, - "no_copy": 0, - "options": "Salary Component", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "earning_component.pay_against_benefit_claim", - "fieldname": "pay_against_benefit_claim", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Pay Against Benefit Claim", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "earning_component.max_benefit_amount", - "fieldname": "max_benefit_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Max Benefit Amount", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-08-21 16:15:42.111118", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Benefit Application Detail", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "search_fields": "", - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json deleted file mode 100644 index 1aa69d02a5a..00000000000 --- a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.json +++ /dev/null @@ -1,580 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "HR-BEN-CLM-.YY.-.MM.-.#####", - "beta": 0, - "creation": "2018-04-13 16:43:10.386409", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "employee", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Employee", - "length": 0, - "no_copy": 0, - "options": "Employee", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "employee.employee_name", - "fieldname": "employee_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Employee Name", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "employee.department", - "fieldname": "department", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Department", - "length": 0, - "no_copy": 0, - "options": "Department", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Today", - "fieldname": "claim_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Claim Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "benefit_type_and_amount", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Benefit Type and Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "earning_component", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Claim Benefit For", - "length": 0, - "no_copy": 0, - "options": "Salary Component", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "earning_component.max_benefit_amount", - "fieldname": "max_amount_eligible", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Max Amount Eligible", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "earning_component.pay_against_benefit_claim", - "fieldname": "pay_against_benefit_claim", - "fieldtype": "Check", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Pay Against Benefit Claim", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "claimed_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Claimed Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "salary_slip", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Salary Slip", - "length": 0, - "no_copy": 0, - "options": "Salary Slip", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "options": "Employee Benefit Claim", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_9", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Expense Proof", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "attachments", - "fieldtype": "Attach", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Attachments", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-08-21 16:15:35.942067", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Benefit Claim", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - }, - { - "amend": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - }, - { - "amend": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Employee", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "title_field": "employee_name", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py index 420bbe6b1a9..9e7d3186b88 100644 --- a/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py +++ b/erpnext/hr/doctype/employee_promotion/test_employee_promotion.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe import unittest from frappe.utils import getdate, add_days -from erpnext.hr.doctype.salary_structure.test_salary_structure import make_employee +from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_employee class TestEmployeePromotion(unittest.TestCase): def setUp(self): diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json b/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json deleted file mode 100644 index 66fac5bee5c..00000000000 --- a/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 1, - "autoname": "Prompt", - "beta": 0, - "creation": "2018-04-13 16:51:36.971140", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "max_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Max Exemption Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "fetch_if_empty": 0, - "fieldname": "is_active", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Active", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2019-04-25 13:20:31.367158", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Tax Exemption Category", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json b/erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json deleted file mode 100644 index 7b3b8f5caae..00000000000 --- a/erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-04-13 16:56:23.333041", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "exemption_sub_category", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Exemption Sub Category", - "length": 0, - "no_copy": 0, - "options": "Employee Tax Exemption Sub Category", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "exemption_sub_category.exemption_category", - "fetch_if_empty": 0, - "fieldname": "exemption_category", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Exemption Category", - "length": 0, - "no_copy": 0, - "options": "Employee Tax Exemption Category", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "exemption_sub_category.max_amount", - "fetch_if_empty": 0, - "fieldname": "max_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Maximum Exempted Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Declared Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2019-04-26 11:28:14.023086", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Tax Exemption Declaration Category", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py deleted file mode 100644 index e54d9193ba7..00000000000 --- a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest -# from erpnext.hr.doctype.employee_tax_exemption_declaration.test_employee_tax_exemption_declaration import create_exemption_category, create_payroll_period -# -# class TestEmployeeTaxExemptionProofSubmission(unittest.TestCase): -# def setup(self): -# make_employee("employee@proofsubmission.com") -# create_payroll_period() -# create_exemption_category() -# frappe.db.sql("""delete from `tabEmployee Tax Exemption Proof Submission`""") -# -# def test_exemption_amount_lesser_than_category_max(self): -# declaration = frappe.get_doc({ -# "doctype": "Employee Tax Exemption Proof Submission", -# "employee": frappe.get_value("Employee", {"user_id":"employee@proofsubmission.com"}, "name"), -# "payroll_period": "Test Payroll Period", -# "tax_exemption_proofs": [dict(exemption_sub_category = "_Test Sub Category", -# type_of_proof = "Test Proof", -# exemption_category = "_Test Category", -# amount = 150000)] -# }) -# self.assertRaises(frappe.ValidationError, declaration.save) -# declaration = frappe.get_doc({ -# "doctype": "Employee Tax Exemption Proof Submission", -# "payroll_period": "Test Payroll Period", -# "employee": frappe.get_value("Employee", {"user_id":"employee@proofsubmission.com"}, "name"), -# "tax_exemption_proofs": [dict(exemption_sub_category = "_Test Sub Category", -# type_of_proof = "Test Proof", -# exemption_category = "_Test Category", -# amount = 100000)] -# }) -# self.assertTrue(declaration.save) -# self.assertTrue(declaration.submit) -# -# def test_duplicate_category_in_proof_submission(self): -# declaration = frappe.get_doc({ -# "doctype": "Employee Tax Exemption Proof Submission", -# "employee": frappe.get_value("Employee", {"user_id":"employee@proofsubmission.com"}, "name"), -# "payroll_period": "Test Payroll Period", -# "tax_exemption_proofs": [dict(exemption_sub_category = "_Test Sub Category", -# exemption_category = "_Test Category", -# type_of_proof = "Test Proof", -# amount = 100000), -# dict(exemption_sub_category = "_Test Sub Category", -# exemption_category = "_Test Category", -# amount = 50000), -# ] -# }) -# self.assertRaises(frappe.ValidationError, declaration.save) diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json b/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json deleted file mode 100644 index b9254afad07..00000000000 --- a/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json +++ /dev/null @@ -1,213 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-04-13 17:19:03.006149", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "exemption_sub_category", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Exemption Sub Category", - "length": 0, - "no_copy": 0, - "options": "Employee Tax Exemption Sub Category", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "exemption_sub_category.exemption_category", - "fetch_if_empty": 0, - "fieldname": "exemption_category", - "fieldtype": "Read Only", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Exemption Category", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "exemption_sub_category.max_amount", - "fetch_if_empty": 0, - "fieldname": "max_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Maximum Exemption Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "type_of_proof", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Type of Proof", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Actual Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2019-04-25 15:45:03.154904", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Tax Exemption Proof Submission Detail", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json b/erpnext/hr/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json deleted file mode 100644 index b0e492e7ca4..00000000000 --- a/erpnext/hr/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 1, - "autoname": "Prompt", - "beta": 0, - "creation": "2018-05-09 12:47:26.983095", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "exemption_category", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Tax Exemption Category", - "length": 0, - "no_copy": 0, - "options": "Employee Tax Exemption Category", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "exemption_category.max_amount", - "fetch_if_empty": 1, - "fieldname": "max_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Max Exemption Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "fetch_if_empty": 0, - "fieldname": "is_active", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Active", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2019-04-25 13:24:05.164877", - "modified_by": "Administrator", - "module": "HR", - "name": "Employee Tax Exemption Sub Category", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/hr_settings/hr_settings.js b/erpnext/hr/doctype/hr_settings/hr_settings.js index b629b42f9b1..fd082fda09b 100644 --- a/erpnext/hr/doctype/hr_settings/hr_settings.js +++ b/erpnext/hr/doctype/hr_settings/hr_settings.js @@ -2,21 +2,6 @@ // For license information, please see license.txt frappe.ui.form.on('HR Settings', { - encrypt_salary_slips_in_emails: function(frm) { - let encrypt_state = frm.doc.encrypt_salary_slips_in_emails; - frm.set_df_property('password_policy', 'reqd', encrypt_state); - }, - - validate: function(frm) { - let policy = frm.doc.password_policy; - if (policy) { - if (policy.includes(' ') || policy.includes('--')) { - frappe.msgprint(__("Password policy cannot contain spaces or simultaneous hyphens. The format will be restructured automatically")); - } - frm.set_value('password_policy', policy.split(new RegExp(" |-", 'g')).filter((token) => token).join('-')); - } - }, - restrict_backdated_leave_application: function(frm) { frm.toggle_reqd("role_allowed_to_create_backdated_leave_application", frm.doc.restrict_backdated_leave_application); } diff --git a/erpnext/hr/doctype/hr_settings/hr_settings.json b/erpnext/hr/doctype/hr_settings/hr_settings.json index ebf8723be65..c42e1d72fcc 100644 --- a/erpnext/hr/doctype/hr_settings/hr_settings.json +++ b/erpnext/hr/doctype/hr_settings/hr_settings.json @@ -12,16 +12,6 @@ "column_break_4", "stop_birthday_reminders", "expense_approver_mandatory_in_expense_claim", - "payroll_settings", - "payroll_based_on", - "max_working_hours_against_timesheet", - "include_holidays_in_total_working_days", - "disable_rounded_total", - "column_break_11", - "daily_wages_fraction_for_half_day", - "email_salary_slip_to_employee", - "encrypt_salary_slips_in_emails", - "password_policy", "leave_settings", "leave_approval_notification_template", "leave_status_notification_template", @@ -38,13 +28,17 @@ { "fieldname": "employee_settings", "fieldtype": "Section Break", - "label": "Employee Settings" + "label": "Employee Settings", + "show_days": 1, + "show_seconds": 1 }, { "description": "Enter retirement age in years", "fieldname": "retirement_age", "fieldtype": "Data", - "label": "Retirement Age" + "label": "Retirement Age", + "show_days": 1, + "show_seconds": 1 }, { "default": "Naming Series", @@ -52,161 +46,126 @@ "fieldname": "emp_created_by", "fieldtype": "Select", "label": "Employee Records to be created by", - "options": "Naming Series\nEmployee Number\nFull Name" + "options": "Naming Series\nEmployee Number\nFull Name", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_4", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "description": "Don't send Employee Birthday Reminders", "fieldname": "stop_birthday_reminders", "fieldtype": "Check", - "label": "Stop Birthday Reminders" + "label": "Stop Birthday Reminders", + "show_days": 1, + "show_seconds": 1 }, { "default": "1", "fieldname": "expense_approver_mandatory_in_expense_claim", "fieldtype": "Check", - "label": "Expense Approver Mandatory In Expense Claim" - }, - { - "fieldname": "payroll_settings", - "fieldtype": "Section Break", - "label": "Payroll Settings" - }, - { - "default": "0", - "description": "If checked, Total no. of Working Days will include holidays, and this will reduce the value of Salary Per Day", - "fieldname": "include_holidays_in_total_working_days", - "fieldtype": "Check", - "label": "Include holidays in Total no. of Working Days" - }, - { - "fieldname": "max_working_hours_against_timesheet", - "fieldtype": "Float", - "label": "Max working hours against Timesheet" - }, - { - "fieldname": "column_break_11", - "fieldtype": "Column Break" - }, - { - "default": "1", - "description": "Emails salary slip to employee based on preferred email selected in Employee", - "fieldname": "email_salary_slip_to_employee", - "fieldtype": "Check", - "label": "Email Salary Slip to Employee" - }, - { - "default": "0", - "depends_on": "eval: doc.email_salary_slip_to_employee == 1;", - "description": "The salary slip emailed to the employee will be password protected, the password will be generated based on the password policy.", - "fieldname": "encrypt_salary_slips_in_emails", - "fieldtype": "Check", - "label": "Encrypt Salary Slips in Emails" - }, - { - "depends_on": "eval: doc.encrypt_salary_slips_in_emails == 1", - "description": "Example: SAL-{first_name}-{date_of_birth.year}
This will generate a password like SAL-Jane-1972", - "fieldname": "password_policy", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Password Policy" + "label": "Expense Approver Mandatory In Expense Claim", + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "leave_settings", "fieldtype": "Section Break", - "label": "Leave Settings" + "label": "Leave Settings", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "leave_approval_notification_template", "fieldtype": "Link", "label": "Leave Approval Notification Template", - "options": "Email Template" + "options": "Email Template", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "leave_status_notification_template", "fieldtype": "Link", "label": "Leave Status Notification Template", - "options": "Email Template" + "options": "Email Template", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_18", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "1", "fieldname": "leave_approver_mandatory_in_leave_application", "fieldtype": "Check", - "label": "Leave Approver Mandatory In Leave Application" + "label": "Leave Approver Mandatory In Leave Application", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "show_leaves_of_all_department_members_in_calendar", "fieldtype": "Check", - "label": "Show Leaves Of All Department Members In Calendar" + "label": "Show Leaves Of All Department Members In Calendar", + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "hiring_settings", "fieldtype": "Section Break", - "label": "Hiring Settings" + "label": "Hiring Settings", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "check_vacancies", "fieldtype": "Check", - "label": "Check Vacancies On Job Offer Creation" + "label": "Check Vacancies On Job Offer Creation", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "auto_leave_encashment", "fieldtype": "Check", - "label": "Auto Leave Encashment" - }, - { - "default": "0", - "description": "If checked, hides and disables Rounded Total field in Salary Slips", - "fieldname": "disable_rounded_total", - "fieldtype": "Check", - "label": "Disable Rounded Total" + "label": "Auto Leave Encashment", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "restrict_backdated_leave_application", "fieldtype": "Check", - "label": "Restrict Backdated Leave Application" + "label": "Restrict Backdated Leave Application", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:doc.restrict_backdated_leave_application == 1", "fieldname": "role_allowed_to_create_backdated_leave_application", "fieldtype": "Link", "label": "Role Allowed to Create Backdated Leave Application", - "options": "Role" - }, - { - "default": "Leave", - "fieldname": "payroll_based_on", - "fieldtype": "Select", - "label": "Calculate Payroll Working Days Based On", - "options": "Leave\nAttendance" - }, - { - "default": "0.5", - "description": "The fraction of daily wages to be paid for half-day attendance", - "fieldname": "daily_wages_fraction_for_half_day", - "fieldtype": "Float", - "label": "Daily Wages Fraction for Half Day" + "options": "Role", + "show_days": 1, + "show_seconds": 1 } ], "icon": "fa fa-cog", "idx": 1, "issingle": 1, "links": [], - "modified": "2020-05-11 13:02:51.274347", + "modified": "2020-06-04 15:15:09.865476", "modified_by": "Administrator", "module": "HR", "name": "HR Settings", diff --git a/erpnext/hr/doctype/hr_settings/hr_settings.py b/erpnext/hr/doctype/hr_settings/hr_settings.py index 5ed4c87c62f..ced98fb9a58 100644 --- a/erpnext/hr/doctype/hr_settings/hr_settings.py +++ b/erpnext/hr/doctype/hr_settings/hr_settings.py @@ -5,34 +5,14 @@ from __future__ import unicode_literals import frappe -from frappe import _ from frappe.model.document import Document -from frappe.utils import cint -from frappe.custom.doctype.property_setter.property_setter import make_property_setter class HRSettings(Document): def validate(self): self.set_naming_series() - self.validate_password_policy() - - if not self.daily_wages_fraction_for_half_day: - self.daily_wages_fraction_for_half_day = 0.5 def set_naming_series(self): from erpnext.setup.doctype.naming_series.naming_series import set_by_naming_series set_by_naming_series("Employee", "employee_number", self.get("emp_created_by")=="Naming Series", hide_name_field=True) - def validate_password_policy(self): - if self.email_salary_slip_to_employee and self.encrypt_salary_slips_in_emails: - if not self.password_policy: - frappe.throw(_("Password policy for Salary Slips is not set")) - - def on_update(self): - self.toggle_rounded_total() - frappe.clear_cache() - - def toggle_rounded_total(self): - self.disable_rounded_total = cint(self.disable_rounded_total) - make_property_setter("Salary Slip", "rounded_total", "hidden", self.disable_rounded_total, "Check") - make_property_setter("Salary Slip", "rounded_total", "print_hide", self.disable_rounded_total, "Check") diff --git a/erpnext/hr/doctype/leave_encashment/leave_encashment.py b/erpnext/hr/doctype/leave_encashment/leave_encashment.py index 50a08b12bc0..8913c648c52 100644 --- a/erpnext/hr/doctype/leave_encashment/leave_encashment.py +++ b/erpnext/hr/doctype/leave_encashment/leave_encashment.py @@ -8,7 +8,7 @@ from frappe import _ from frappe.model.document import Document from frappe.utils import getdate, nowdate, flt from erpnext.hr.utils import set_employee_name -from erpnext.hr.doctype.salary_structure_assignment.salary_structure_assignment import get_assigned_salary_structure +from erpnext.payroll.doctype.salary_structure_assignment.salary_structure_assignment import get_assigned_salary_structure from erpnext.hr.doctype.leave_ledger_entry.leave_ledger_entry import create_leave_ledger_entry from erpnext.hr.doctype.leave_allocation.leave_allocation import get_unused_leaves diff --git a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py index ac7755b23a7..99f64634161 100644 --- a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py +++ b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py @@ -7,7 +7,7 @@ import frappe import unittest from frappe.utils import today, add_months from erpnext.hr.doctype.employee.test_employee import make_employee -from erpnext.hr.doctype.salary_structure.test_salary_structure import make_salary_structure +from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure from erpnext.hr.doctype.leave_period.test_leave_period import create_leave_period from erpnext.hr.doctype.leave_policy.test_leave_policy import create_leave_policy\ diff --git a/erpnext/hr/doctype/payroll_employee_detail/payroll_employee_detail.json b/erpnext/hr/doctype/payroll_employee_detail/payroll_employee_detail.json deleted file mode 100644 index 0dd3403d665..00000000000 --- a/erpnext/hr/doctype/payroll_employee_detail/payroll_employee_detail.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2017-11-30 06:07:33.477781", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "employee", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Employee", - "length": 0, - "no_copy": 0, - "options": "Employee", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "employee.employee_name", - "fieldname": "employee_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Employee Name", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "employee.department", - "fieldname": "department", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Department", - "length": 0, - "no_copy": 0, - "options": "Department", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "employee.designation", - "fieldname": "designation", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Designation", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2019-01-30 11:28:16.544471", - "modified_by": "Administrator", - "module": "HR", - "name": "Payroll Employee Detail", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 1, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/payroll_period_date/payroll_period_date.json b/erpnext/hr/doctype/payroll_period_date/payroll_period_date.json deleted file mode 100644 index 29bd2a33220..00000000000 --- a/erpnext/hr/doctype/payroll_period_date/payroll_period_date.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-04-13 15:17:30.513630", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "start_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Start Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "end_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "End Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-04-13 19:39:37.473294", - "modified_by": "Administrator", - "module": "HR", - "name": "Payroll Period Date", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.json b/erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.json deleted file mode 100644 index 797f8f7c028..00000000000 --- a/erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2016-06-14 19:22:29.811658", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "time_sheet", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Time Sheet", - "length": 0, - "no_copy": 0, - "options": "Timesheet", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "working_hours", - "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Working Hours", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2019-02-19 08:33:41.762144", - "modified_by": "Administrator", - "module": "HR", - "name": "Salary Slip Timesheet", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.json b/erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.json deleted file mode 100644 index a094f8a1971..00000000000 --- a/erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.json +++ /dev/null @@ -1,232 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-04-13 17:42:13.516032", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "from_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "From Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "to_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "To Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "percent_deduction", - "fieldtype": "Percent", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Percent Deduction", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "condition", - "fieldtype": "Code", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Condition", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_5", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "html_6", - "fieldtype": "HTML", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "options": "

Condition Examples

\n
    \n
  1. Applying tax if employee born between 31-12-1937 and 01-01-1958 (Employees aged 60 to 80)
    \nCondition: date_of_birth>date(1937, 12, 31) and date_of_birth<date(1958, 01, 01)

  2. Applying tax by employee gender
    \nCondition: gender==\"Male\"

  3. \n
  4. Applying tax by Salary Component
    \nCondition: base > 10000
", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-06-19 10:10:23.732132", - "modified_by": "Administrator", - "module": "HR", - "name": "Taxable Salary Slab", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} diff --git a/erpnext/hr/doctype/training_event/test_training_event.py b/erpnext/hr/doctype/training_event/test_training_event.py index 57123e304f5..313f90eba85 100644 --- a/erpnext/hr/doctype/training_event/test_training_event.py +++ b/erpnext/hr/doctype/training_event/test_training_event.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe import unittest from frappe.utils import today, add_days -from erpnext.hr.doctype.salary_structure.test_salary_structure import make_employee +from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_employee class TestTrainingEvent(unittest.TestCase): def setUp(self): diff --git a/erpnext/hr/report/salary_register/salary_register.json b/erpnext/hr/report/salary_register/salary_register.json deleted file mode 100644 index 89a7ba29101..00000000000 --- a/erpnext/hr/report/salary_register/salary_register.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "add_total_row": 1, - "apply_user_permissions": 1, - "creation": "2017-01-10 17:36:58.153863", - "disabled": 0, - "docstatus": 0, - "doctype": "Report", - "idx": 2, - "is_standard": "Yes", - "modified": "2017-02-24 19:58:33.143974", - "modified_by": "Administrator", - "module": "HR", - "name": "Salary Register", - "owner": "Administrator", - "ref_doctype": "Salary Slip", - "report_name": "Salary Register", - "report_type": "Script Report", - "roles": [ - { - "role": "HR User" - }, - { - "role": "HR Manager" - } - ] -} \ No newline at end of file diff --git a/erpnext/loan_management/doctype/loan/test_loan.py b/erpnext/loan_management/doctype/loan/test_loan.py index 364e2ffecf8..3f37a26418b 100644 --- a/erpnext/loan_management/doctype/loan/test_loan.py +++ b/erpnext/loan_management/doctype/loan/test_loan.py @@ -9,7 +9,7 @@ import unittest from frappe.utils import (nowdate, add_days, getdate, now_datetime, add_to_date, get_datetime, add_months, get_first_day, get_last_day, flt, date_diff) from erpnext.selling.doctype.customer.test_customer import get_customer_dict -from erpnext.hr.doctype.salary_structure.test_salary_structure import make_employee +from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_employee from erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import (process_loan_interest_accrual_for_demand_loans, process_loan_interest_accrual_for_term_loans) from erpnext.loan_management.doctype.loan_interest_accrual.loan_interest_accrual import days_in_year diff --git a/erpnext/loan_management/doctype/loan_application/test_loan_application.py b/erpnext/loan_management/doctype/loan_application/test_loan_application.py index 99c807b2cd3..687c58000e2 100644 --- a/erpnext/loan_management/doctype/loan_application/test_loan_application.py +++ b/erpnext/loan_management/doctype/loan_application/test_loan_application.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe import unittest -from erpnext.hr.doctype.salary_structure.test_salary_structure import make_employee +from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_employee from erpnext.loan_management.doctype.loan.test_loan import create_loan_type, create_loan_accounts class TestLoanApplication(unittest.TestCase): diff --git a/erpnext/modules.txt b/erpnext/modules.txt index 3b347582c35..1e2aeea36a8 100644 --- a/erpnext/modules.txt +++ b/erpnext/modules.txt @@ -24,4 +24,5 @@ Hotels Hub Node Quality Management Communication -Loan Management \ No newline at end of file +Loan Management +Payroll \ No newline at end of file diff --git a/erpnext/patches.txt b/erpnext/patches.txt index a7395a476a6..b17cc474447 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -333,7 +333,7 @@ erpnext.patches.v7_0.update_mode_of_payment_type execute:frappe.reload_doctype('Employee') #2016-10-18 execute:frappe.db.sql("update `tabEmployee` set prefered_contact_email = IFNULL(prefered_contact_email,'') ") -execute:frappe.reload_doctype("Salary Slip") +execute:frappe.reload_doc("Payroll", "doctype", "salary_slip") execute:frappe.db.sql("update `tabSalary Slip` set posting_date=creation") execute:frappe.reload_doc("stock", "doctype", "stock_settings") erpnext.patches.v8_0.create_domain_docs #16-05-2017 @@ -701,4 +701,7 @@ erpnext.patches.v13_0.update_sla_enhancements erpnext.patches.v12_0.update_address_template_for_india erpnext.patches.v12_0.set_multi_uom_in_rfq erpnext.patches.v13_0.delete_old_sales_reports -execute:frappe.delete_doc_if_exists("DocType", "Bank Reconciliation") \ No newline at end of file +execute:frappe.delete_doc_if_exists("DocType", "Bank Reconciliation") +erpnext.patches.v13_0.move_doctype_reports_and_notification_from_hr_to_payroll +erpnext.patches.v13_0.move_payroll_setting_separately_from_hr_settings +erpnext.patches.v13_0.check_is_income_tax_component diff --git a/erpnext/patches/v11_0/create_department_records_for_each_company.py b/erpnext/patches/v11_0/create_department_records_for_each_company.py index f09c5b2c5df..e9b5950a133 100644 --- a/erpnext/patches/v11_0/create_department_records_for_each_company.py +++ b/erpnext/patches/v11_0/create_department_records_for_each_company.py @@ -6,8 +6,9 @@ from frappe.utils.nestedset import rebuild_tree def execute(): frappe.local.lang = frappe.db.get_default("lang") or 'en' - for doctype in ['department', 'leave_period', 'staffing_plan', 'job_opening', 'payroll_entry']: + for doctype in ['department', 'leave_period', 'staffing_plan', 'job_opening']: frappe.reload_doc("hr", "doctype", doctype) + frappe.reload_doc("Payroll", "doctype", 'payroll_entry') companies = frappe.db.get_all("Company", fields=["name", "abbr"]) departments = frappe.db.get_all("Department") diff --git a/erpnext/patches/v11_0/create_salary_structure_assignments.py b/erpnext/patches/v11_0/create_salary_structure_assignments.py index 610fa85172f..c51c38182cc 100644 --- a/erpnext/patches/v11_0/create_salary_structure_assignments.py +++ b/erpnext/patches/v11_0/create_salary_structure_assignments.py @@ -5,11 +5,11 @@ from __future__ import unicode_literals import frappe from datetime import datetime from frappe.utils import getdate -from erpnext.hr.doctype.salary_structure_assignment.salary_structure_assignment import DuplicateAssignment +from erpnext.payroll.doctype.salary_structure_assignment.salary_structure_assignment import DuplicateAssignment def execute(): - frappe.reload_doc('hr', 'doctype', 'salary_structure') - frappe.reload_doc("hr", "doctype", "salary_structure_assignment") + frappe.reload_doc('Payroll', 'doctype', 'salary_structure') + frappe.reload_doc("Payroll", "doctype", "salary_structure_assignment") frappe.db.sql(""" delete from `tabSalary Structure Assignment` where salary_structure in (select name from `tabSalary Structure` where is_active='No' or docstatus!=1) diff --git a/erpnext/patches/v11_0/inter_state_field_for_gst.py b/erpnext/patches/v11_0/inter_state_field_for_gst.py index 48249c9bbf5..730eebc01ce 100644 --- a/erpnext/patches/v11_0/inter_state_field_for_gst.py +++ b/erpnext/patches/v11_0/inter_state_field_for_gst.py @@ -6,8 +6,8 @@ def execute(): company = frappe.get_all('Company', filters = {'country': 'India'}) if not company: return - frappe.reload_doc("hr", "doctype", "Employee Tax Exemption Declaration") - frappe.reload_doc("hr", "doctype", "Employee Tax Exemption Proof Submission") + frappe.reload_doc("Payroll", "doctype", "Employee Tax Exemption Declaration") + frappe.reload_doc("Payroll", "doctype", "Employee Tax Exemption Proof Submission") frappe.reload_doc("hr", "doctype", "Employee Grade") frappe.reload_doc("hr", "doctype", "Leave Policy") diff --git a/erpnext/patches/v11_0/set_salary_component_properties.py b/erpnext/patches/v11_0/set_salary_component_properties.py index 83fb53d2a73..2498888273d 100644 --- a/erpnext/patches/v11_0/set_salary_component_properties.py +++ b/erpnext/patches/v11_0/set_salary_component_properties.py @@ -2,8 +2,8 @@ from __future__ import unicode_literals import frappe def execute(): - frappe.reload_doc('hr', 'doctype', 'salary_detail') - frappe.reload_doc('hr', 'doctype', 'salary_component') + frappe.reload_doc('Payroll', 'doctype', 'salary_detail') + frappe.reload_doc('Payroll', 'doctype', 'salary_component') frappe.db.sql("update `tabSalary Component` set is_tax_applicable=1 where type='Earning'") diff --git a/erpnext/patches/v11_1/rename_depends_on_lwp.py b/erpnext/patches/v11_1/rename_depends_on_lwp.py index 20d8867e1d2..a0f2536f7d8 100644 --- a/erpnext/patches/v11_1/rename_depends_on_lwp.py +++ b/erpnext/patches/v11_1/rename_depends_on_lwp.py @@ -9,5 +9,5 @@ from frappe.model.utils.rename_field import rename_field def execute(): for doctype in ("Salary Component", "Salary Detail"): if "depends_on_lwp" in frappe.db.get_table_columns(doctype): - frappe.reload_doc("hr", "doctype", scrub(doctype)) + frappe.reload_doc("Payroll", "doctype", scrub(doctype)) rename_field(doctype, "depends_on_lwp", "depends_on_payment_days") \ No newline at end of file diff --git a/erpnext/patches/v13_0/check_is_income_tax_component.py b/erpnext/patches/v13_0/check_is_income_tax_component.py new file mode 100644 index 00000000000..f69412c5383 --- /dev/null +++ b/erpnext/patches/v13_0/check_is_income_tax_component.py @@ -0,0 +1,24 @@ +# Copyright (c) 2019, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals + +import frappe, erpnext + +def execute(): + frappe.reload_doc('Payroll', 'doctype', 'salary_structure') + + if frappe.db.exists("Salary Component", "Income Tax"): + frappe.db.set_value("Salary Component", "Income Tax", "is_income_tax_component", 1) + if frappe.db.exists("Salary Component", "TDS"): + frappe.db.set_value("Salary Component", "TDS", "is_income_tax_component", 1) + + components = frappe.db.sql("select name from `tabSalary Component` where variable_based_on_taxable_salary = 1", as_dict=1) + for component in components: + frappe.db.set_value("Salary Component", component.name, "is_income_tax_component", 1) + + if erpnext.get_region() == "India": + if frappe.db.exists("Salary Component", "Provident Fund"): + frappe.db.set_value("Salary Component", "Provident Fund", "component_type", "Provident Fund") + if frappe.db.exists("Salary Component", "Professional Tax"): + frappe.db.set_value("Salary Component", "Professional Tax", "component_type", "Professional Tax") \ No newline at end of file diff --git a/erpnext/patches/v13_0/move_doctype_reports_and_notification_from_hr_to_payroll.py b/erpnext/patches/v13_0/move_doctype_reports_and_notification_from_hr_to_payroll.py new file mode 100644 index 00000000000..4d7c85ce2d1 --- /dev/null +++ b/erpnext/patches/v13_0/move_doctype_reports_and_notification_from_hr_to_payroll.py @@ -0,0 +1,52 @@ +# Copyright (c) 2019, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals + +import frappe + +def execute(): + frappe.db.sql("""UPDATE `tabPrint Format` + SET module = 'Payroll' + WHERE name IN ('Salary Slip Based On Timesheet', 'Salary Slip Standard')""" + ) + + frappe.db.sql("""UPDATE `tabNotification` SET module='Payroll' WHERE name='Retention Bonus';""" + ) + + doctypes_moved = [ + 'Employee Benefit Application Detail', + 'Employee Tax Exemption Declaration Category', + 'Salary Component', + 'Employee Tax Exemption Proof Submission Detail', + 'Income Tax Slab Other Charges', + 'Taxable Salary Slab', + 'Payroll Period Date', + 'Salary Slip Timesheet', + 'Payroll Employee Detail', + 'Salary Detail', + 'Employee Tax Exemption Sub Category', + 'Employee Tax Exemption Category', + 'Employee Benefit Claim', + 'Employee Benefit Application', + 'Employee Other Income', + 'Employee Tax Exemption Proof Submission', + 'Employee Tax Exemption Declaration', + 'Employee Incentive', + 'Retention Bonus', + 'Additional Salary', + 'Income Tax Slab', + 'Payroll Period', + 'Salary Slip', + 'Payroll Entry', + 'Salary Structure Assignment', + 'Salary Structure' + ] + + for doctype in doctypes_moved: + frappe.delete_doc_if_exists("DocType", doctype) + + reports = ["Salary Register", "Bank Remittance"] + + for report in reports: + frappe.delete_doc_if_exists("Report", report) diff --git a/erpnext/patches/v13_0/move_payroll_setting_separately_from_hr_settings.py b/erpnext/patches/v13_0/move_payroll_setting_separately_from_hr_settings.py new file mode 100644 index 00000000000..a901064b889 --- /dev/null +++ b/erpnext/patches/v13_0/move_payroll_setting_separately_from_hr_settings.py @@ -0,0 +1,27 @@ +# Copyright (c) 2019, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals + +import frappe + +def execute(): + data = frappe.db.sql('''SELECT * + FROM `tabSingles` + WHERE + doctype = "HR Settings" + AND + field in ( + "encrypt_salary_slips_in_emails", + "email_salary_slip_to_employee", + "daily_wages_fraction_for_half_day", + "disable_rounded_total", + "include_holidays_in_total_working_days", + "max_working_hours_against_timesheet", + "payroll_based_on", + "password_policy" + ) + ''', as_dict=1) + + for d in data: + frappe.db.set_value("Payroll Settings", None, d.field, d.value) diff --git a/erpnext/patches/v13_0/move_tax_slabs_from_payroll_period_to_income_tax_slab.py b/erpnext/patches/v13_0/move_tax_slabs_from_payroll_period_to_income_tax_slab.py index 5ade8ca0f4c..1a91d218ba3 100644 --- a/erpnext/patches/v13_0/move_tax_slabs_from_payroll_period_to_income_tax_slab.py +++ b/erpnext/patches/v13_0/move_tax_slabs_from_payroll_period_to_income_tax_slab.py @@ -11,7 +11,7 @@ def execute(): return for doctype in ("income_tax_slab", "salary_structure_assignment", "employee_other_income", "income_tax_slab_other_charges"): - frappe.reload_doc("hr", "doctype", doctype) + frappe.reload_doc("Payroll", "doctype", doctype) standard_tax_exemption_amount_exists = frappe.db.has_column("Payroll Period", "standard_tax_exemption_amount") @@ -29,7 +29,7 @@ def execute(): WHERE company=%s ORDER BY start_date DESC """.format(select_fields), company.name, as_dict = 1) - + for i, period in enumerate(payroll_periods): income_tax_slab = frappe.new_doc("Income Tax Slab") income_tax_slab.name = "Tax Slab:" + period.name diff --git a/erpnext/patches/v13_0/patch_to_fix_reverse_linking_in_additional_salary_encashment_and_incentive.py b/erpnext/patches/v13_0/patch_to_fix_reverse_linking_in_additional_salary_encashment_and_incentive.py index ddcadcb4de9..fde8f864703 100644 --- a/erpnext/patches/v13_0/patch_to_fix_reverse_linking_in_additional_salary_encashment_and_incentive.py +++ b/erpnext/patches/v13_0/patch_to_fix_reverse_linking_in_additional_salary_encashment_and_incentive.py @@ -6,8 +6,10 @@ def execute(): if not frappe.db.table_exists("Additional Salary"): return - for doctype in ("Additional Salary", "Leave Encashment", "Employee Incentive", "Salary Detail"): - frappe.reload_doc("hr", "doctype", doctype) + for doctype in ("Additional Salary", "Employee Incentive", "Salary Detail"): + frappe.reload_doc("Payroll", "doctype", doctype) + + frappe.reload_doc("hr", "doctype", "Leave Encashment") additional_salaries = frappe.get_all("Additional Salary", fields = ['name', "salary_slip", "type", "salary_component"], diff --git a/erpnext/patches/v4_0/create_custom_fields_for_india_specific_fields.py b/erpnext/patches/v4_0/create_custom_fields_for_india_specific_fields.py index 9c602a3f782..fe50e444b52 100644 --- a/erpnext/patches/v4_0/create_custom_fields_for_india_specific_fields.py +++ b/erpnext/patches/v4_0/create_custom_fields_for_india_specific_fields.py @@ -8,7 +8,7 @@ from frappe.custom.doctype.custom_field.custom_field import create_custom_field_ def execute(): frappe.reload_doc("stock", "doctype", "purchase_receipt") frappe.reload_doc("hr", "doctype", "employee") - frappe.reload_doc("hr", "doctype", "salary_slip") + frappe.reload_doc("Payroll", "doctype", "salary_slip") india_specific_fields = { "Purchase Receipt": [{ diff --git a/erpnext/patches/v5_0/rename_table_fieldnames.py b/erpnext/patches/v5_0/rename_table_fieldnames.py index 59f534303f1..aefb0a20372 100644 --- a/erpnext/patches/v5_0/rename_table_fieldnames.py +++ b/erpnext/patches/v5_0/rename_table_fieldnames.py @@ -220,7 +220,7 @@ def execute(): frappe.reload_doc("manufacturing", "doctype", "work_order_operation") frappe.reload_doc("manufacturing", "doctype", "workstation_working_hour") frappe.reload_doc("stock", "doctype", "item_variant") - frappe.reload_doc("hr", "doctype", "salary_detail") + frappe.reload_doc("Payroll", "doctype", "salary_detail") frappe.reload_doc("accounts", "doctype", "party_account") frappe.reload_doc("accounts", "doctype", "fiscal_year_company") diff --git a/erpnext/patches/v7_0/rename_salary_components.py b/erpnext/patches/v7_0/rename_salary_components.py index bc48e343174..1693f3bdf1f 100644 --- a/erpnext/patches/v7_0/rename_salary_components.py +++ b/erpnext/patches/v7_0/rename_salary_components.py @@ -6,8 +6,8 @@ def execute(): if not frappe.db.exists("DocType", "Salary Structure Earning"): return - frappe.reload_doc("hr", "doctype", "salary_detail") - frappe.reload_doc("hr", "doctype", "salary_component") + frappe.reload_doc("Payroll", "doctype", "salary_detail") + frappe.reload_doc("Payroll", "doctype", "salary_component") standard_cols = ["name", "creation", "modified", "owner", "modified_by", "parent", "parenttype", "parentfield", "idx"] diff --git a/erpnext/patches/v7_1/update_component_type.py b/erpnext/patches/v7_1/update_component_type.py index 552fc894676..24ca0570e01 100644 --- a/erpnext/patches/v7_1/update_component_type.py +++ b/erpnext/patches/v7_1/update_component_type.py @@ -3,7 +3,7 @@ import frappe from frappe.utils import flt def execute(): - frappe.reload_doc('hr', 'doctype', 'salary_component') + frappe.reload_doc('Payroll', 'doctype', 'salary_component') sal_components = frappe.db.sql(""" select DISTINCT salary_component, parentfield from `tabSalary Detail`""", as_dict=True) diff --git a/erpnext/patches/v7_1/update_missing_salary_component_type.py b/erpnext/patches/v7_1/update_missing_salary_component_type.py index 7d50ee4dff7..824f2b881f0 100644 --- a/erpnext/patches/v7_1/update_missing_salary_component_type.py +++ b/erpnext/patches/v7_1/update_missing_salary_component_type.py @@ -10,12 +10,12 @@ earnings or deductions in existing salary slips def execute(): frappe.reload_doc("accounts", "doctype", "salary_component_account") - frappe.reload_doc("hr", "doctype", "salary_component") - frappe.reload_doc("hr", "doctype", "taxable_salary_slab") - - for s in frappe.db.sql('''select name, type, salary_component_abbr from `tabSalary Component` + frappe.reload_doc("Payroll", "doctype", "salary_component") + frappe.reload_doc("Payroll", "doctype", "taxable_salary_slab") + + for s in frappe.db.sql('''select name, type, salary_component_abbr from `tabSalary Component` where ifnull(type, "")="" or ifnull(salary_component_abbr, "") = ""''', as_dict=1): - + component = frappe.get_doc('Salary Component', s.name) # guess @@ -29,22 +29,22 @@ def execute(): else: component.type = 'Deduction' - + if not s.salary_component_abbr: abbr = ''.join([c[0] for c in component.salary_component.split()]).upper() - + abbr_count = frappe.db.sql(""" - select - count(name) - from - `tabSalary Component` - where + select + count(name) + from + `tabSalary Component` + where salary_component_abbr = %s or salary_component_abbr like %s """, (abbr, abbr + "-%%")) - + if abbr_count and abbr_count[0][0] > 0: abbr = abbr + "-" + cstr(abbr_count[0][0]) - + component.salary_component_abbr = abbr - + component.save() diff --git a/erpnext/patches/v7_2/arrear_leave_encashment_as_salary_component.py b/erpnext/patches/v7_2/arrear_leave_encashment_as_salary_component.py index 3b9642dd3b8..d2583b94224 100644 --- a/erpnext/patches/v7_2/arrear_leave_encashment_as_salary_component.py +++ b/erpnext/patches/v7_2/arrear_leave_encashment_as_salary_component.py @@ -2,7 +2,9 @@ from __future__ import unicode_literals import frappe def execute(): - frappe.reload_doctype('Salary Slip', 'Salary Component') + # frappe.reload_doctype('Salary Slip', 'Salary Component') + frappe.reload_doc("Payroll", "doctype", "Salary Slip") + frappe.reload_doc("Payroll", "doctype", "Salary Component") salary_components = [['Arrear', "ARR"], ['Leave Encashment', 'LENC']] for salary_component, salary_abbr in salary_components: if not frappe.db.exists('Salary Component', salary_component): diff --git a/erpnext/patches/v7_2/update_abbr_in_salary_slips.py b/erpnext/patches/v7_2/update_abbr_in_salary_slips.py index 19dcb5e3b22..57432fe9861 100644 --- a/erpnext/patches/v7_2/update_abbr_in_salary_slips.py +++ b/erpnext/patches/v7_2/update_abbr_in_salary_slips.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe def execute(): - frappe.reload_doctype('Salary Slip') + frappe.reload_doc('Payroll', 'doctype', 'Salary Slip') if not frappe.db.has_column('Salary Detail', 'abbr'): return diff --git a/erpnext/patches/v7_2/update_salary_slips.py b/erpnext/patches/v7_2/update_salary_slips.py index 11a52f95876..9fcce62d8ff 100644 --- a/erpnext/patches/v7_2/update_salary_slips.py +++ b/erpnext/patches/v7_2/update_salary_slips.py @@ -1,10 +1,10 @@ from __future__ import unicode_literals import frappe -from erpnext.hr.doctype.payroll_entry.payroll_entry import get_month_details +from erpnext.payroll.doctype.payroll_entry.payroll_entry import get_month_details from frappe.utils import cint def execute(): - frappe.reload_doctype('Salary Slip') + frappe.reload_doc("Payroll", "doctype", "Salary Slip") if not frappe.db.has_column('Salary Slip', 'fiscal_year'): return diff --git a/erpnext/patches/v8_7/sync_india_custom_fields.py b/erpnext/patches/v8_7/sync_india_custom_fields.py index 73e1b182e82..eb24a90f013 100644 --- a/erpnext/patches/v8_7/sync_india_custom_fields.py +++ b/erpnext/patches/v8_7/sync_india_custom_fields.py @@ -7,11 +7,11 @@ def execute(): if not company: return - frappe.reload_doc('hr', 'doctype', 'payroll_period') - frappe.reload_doc('hr', 'doctype', 'employee_tax_exemption_declaration') - frappe.reload_doc('hr', 'doctype', 'employee_tax_exemption_proof_submission') - frappe.reload_doc('hr', 'doctype', 'employee_tax_exemption_declaration_category') - frappe.reload_doc('hr', 'doctype', 'employee_tax_exemption_proof_submission_detail') + frappe.reload_doc('Payroll', 'doctype', 'payroll_period') + frappe.reload_doc('Payroll', 'doctype', 'employee_tax_exemption_declaration') + frappe.reload_doc('Payroll', 'doctype', 'employee_tax_exemption_proof_submission') + frappe.reload_doc('Payroll', 'doctype', 'employee_tax_exemption_declaration_category') + frappe.reload_doc('Payroll', 'doctype', 'employee_tax_exemption_proof_submission_detail') frappe.reload_doc('accounts', 'doctype', 'tax_category') diff --git a/erpnext/patches/v9_0/update_employee_loan_details.py b/erpnext/patches/v9_0/update_employee_loan_details.py index 86690fc1f83..ef8d32855fb 100644 --- a/erpnext/patches/v9_0/update_employee_loan_details.py +++ b/erpnext/patches/v9_0/update_employee_loan_details.py @@ -5,8 +5,8 @@ from __future__ import unicode_literals import frappe def execute(): - frappe.reload_doc('hr', 'doctype', 'salary_slip_loan') - frappe.reload_doc('hr', 'doctype', 'salary_slip') + frappe.reload_doc('Payroll', 'doctype', 'salary_slip_loan') + frappe.reload_doc('Payroll', 'doctype', 'salary_slip') for data in frappe.db.sql(""" select name, start_date, end_date, total_loan_repayment diff --git a/erpnext/hr/doctype/additional_salary/__init__.py b/erpnext/payroll/__init__.py similarity index 100% rename from erpnext/hr/doctype/additional_salary/__init__.py rename to erpnext/payroll/__init__.py diff --git a/erpnext/payroll/dashboard_fixtures.py b/erpnext/payroll/dashboard_fixtures.py new file mode 100644 index 00000000000..ae7a9ff51af --- /dev/null +++ b/erpnext/payroll/dashboard_fixtures.py @@ -0,0 +1,100 @@ +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +import frappe +import erpnext +from erpnext.hr.dashboard_fixtures import get_dashboards_chart_doc, get_number_cards_doc +import json +from frappe import _ + +def get_data(): + return frappe._dict({ + "dashboards": get_dashboards(), + "charts": get_charts(), + "number_cards": get_number_cards(), + }) + +def get_dashboards(): + dashboards = [] + dashboards.append(get_payroll_dashboard()) + return dashboards + +def get_payroll_dashboard(): + return { + "name": "Payroll", + "dashboard_name": "Payroll", + "is_default": 1, + "charts": [ + { "chart": "Outgoing Salary", "width": "Full"}, + { "chart": "Designation Wise Salary(Last Month)", "width": "Half"}, + { "chart": "Department Wise Salary(Last Month)", "width": "Half"}, + ], + "cards": [ + {"card": "Total Declaration Submitted"}, + {"card": "Total Salary Structure"}, + {"card": "Total Incentive Given(Last month)"}, + {"card": "Total Outgoing Salary(Last month)"}, + ] + } + +def get_charts(): + dashboard_charts= [ + get_dashboards_chart_doc('Outgoing Salary', "Sum", "Line", + document_type = "Salary Slip", based_on="end_date", + value_based_on = "rounded_total", time_interval = "Monthly", timeseries = 1, + filters_json = json.dumps([["Salary Slip", "docstatus", "=", 1]])) + ] + + dashboard_charts.append( + get_dashboards_chart_doc('Department Wise Salary(Last Month)', "Group By", "Bar", + document_type = "Salary Slip", group_by_type="Sum", group_by_based_on="department", + time_interval = "Monthly", aggregate_function_based_on = "rounded_total", + filters_json = json.dumps([ + ["Salary Slip", "docstatus", "=", 1], + ["Salary Slip", "start_date", "Previous","1 month"] + ]) + ) + ) + + dashboard_charts.append( + get_dashboards_chart_doc('Designation Wise Salary(Last Month)', "Group By", "Bar", + document_type = "Salary Slip", group_by_type="Sum", group_by_based_on="designation", + time_interval = "Monthly", aggregate_function_based_on = "rounded_total", + filters_json = json.dumps([ + ["Salary Slip", "docstatus", "=", 1], + ["Salary Slip", "start_date", "Previous","1 month"] + ]) + ) + ) + + return dashboard_charts + +def get_number_cards(): + number_cards = [get_number_cards_doc("Employee Tax Exemption Declaration", "Total Declaration Submitted", filters_json = json.dumps([ + ["Employee Tax Exemption Declaration", "docstatus", "=","1"], + ["Employee Tax Exemption Declaration","creation","Previous","1 year"] + ]) + )] + + number_cards.append(get_number_cards_doc("Employee Incentive", "Total Incentive Given(Last month)", + time_interval = "Monthly", func = "Sum", aggregate_function_based_on = "incentive_amount", + filters_json = json.dumps([ + ["Employee Incentive", "docstatus", "=", 1], + ["Employee Incentive","payroll_date","Previous","1 year"] + ])) + ) + + number_cards.append(get_number_cards_doc("Salary Slip", "Total Outgoing Salary(Last month)", + time_interval = "Monthly", time_span= "Monthly", func = "Sum", aggregate_function_based_on = "rounded_total", + filters_json = json.dumps([ + ["Salary Slip", "docstatus", "=", 1], + ["Salary Slip", "start_date","Previous","1 month"] + ])) + ) + number_cards.append(get_number_cards_doc("Salary Structure", "Total Salary Structure", + filters_json = json.dumps([ + ["Salary Structure", "docstatus", "=", 1] + ])) + ) + + return number_cards \ No newline at end of file diff --git a/erpnext/payroll/desk_page/payroll/payroll.json b/erpnext/payroll/desk_page/payroll/payroll.json new file mode 100644 index 00000000000..b5eac465c82 --- /dev/null +++ b/erpnext/payroll/desk_page/payroll/payroll.json @@ -0,0 +1,84 @@ +{ + "cards": [ + { + "hidden": 0, + "label": "Payroll", + "links": "[\n {\n \"label\": \"Salary Component\",\n \"name\": \"Salary Component\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n \n },\n {\n \"label\": \"Salary Structure\",\n \"name\": \"Salary Structure\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Salary Structure Assignment\",\n \"name\": \"Salary Structure Assignment\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Payroll Entry\",\n \"name\": \"Payroll Entry\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Salary Slip\",\n \"name\": \"Salary Slip\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n }\n]" + }, + { + "hidden": 0, + "label": "Taxation", + "links": "[\n {\n \"label\": \"Payroll Period\",\n \"name\": \"Payroll Period\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n \n },\n {\n \"label\": \"Income Tax Slab\",\n \"name\": \"Income Tax Slab\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n \n },\n {\n \"label\": \"Employee Tax Exemption Declaration\",\n \"name\": \"Employee Tax Exemption Declaration\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n \n },\n {\n \"label\": \"Employee Tax Exemption Proof Submission\",\n \"name\": \"Employee Tax Exemption Proof Submission\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n \n },\n {\n \"label\": \"Employee Tax Exemption Category\",\n \"name\": \"Employee Tax Exemption Category\",\n \"type\": \"doctype\"\n \n },\n {\n \"label\": \"Employee Tax Exemption Sub Category\",\n \"name\": \"Employee Tax Exemption Sub Category\",\n \"type\": \"doctype\"\n \n }\n]" + }, + { + "hidden": 0, + "label": "Compensations", + "links": "[\n {\n \"label\": \"Additional Salary\",\n \"name\": \"Additional Salary\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n \n },\n {\n \"label\": \"Retention Bonus\",\n \"name\": \"Retention Bonus\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Employee Incentive\",\n \"name\": \"Employee Incentive\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Employee Benefit Application\",\n \"name\": \"Employee Benefit Application\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Employee Benefit Claim\",\n \"name\": \"Employee Benefit Claim\",\n \"type\": \"doctype\"\n }\n]" + }, + { + "hidden": 0, + "label": "Reports", + "links": "[\n {\n \"dependencies\": [\n \"Salary Slip\"\n ],\n \"doctype\": \"Salary Slip\",\n \"is_query_report\": true,\n \"label\": \"Salary Register\",\n \"name\": \"Salary Register\",\n \"type\": \"report\"\n \n },\n {\n \"dependencies\": [\n \"Salary Slip\"\n ],\n \"doctype\": \"Salary Slip\",\n \"label\": \"Salary Payments Based On Payment Mode\",\n \"is_query_report\": true,\n \"name\": \"Salary Payments Based On Payment Mode\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Salary Slip\"\n ],\n \"doctype\": \"Salary Slip\",\n \"label\": \"Salary Payments via ECS\",\n \"is_query_report\": true,\n \"name\": \"Salary Payments via ECS\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Salary Slip\"\n ],\n \"doctype\": \"Salary Slip\",\n \"label\": \"Income Tax Deductions\",\n \"is_query_report\": true,\n \"name\": \"Income Tax Deductions\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Salary Slip\"\n ],\n \"doctype\": \"Salary Slip\",\n \"label\": \"Professional Tax Deductions\",\n \"is_query_report\": true,\n \"name\": \"Professional Tax Deductions\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Salary Slip\"\n ],\n \"doctype\": \"Salary Slip\",\n \"label\": \"Provident Fund Deductions\",\n \"is_query_report\": true,\n \"name\": \"Provident Fund Deductions\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Payroll Entry\"\n ],\n \"doctype\": \"Payroll Entry\",\n \"is_query_report\": true,\n \"label\": \"Bank Remittance\",\n \"name\": \"Bank Remittance\",\n \"type\": \"report\"\n \n }\n]" + } + ], + "category": "Modules", + "charts": [ + { + "chart_name": "Outgoing Salary", + "label": "Outgoing Salary" + } + ], + "creation": "2020-05-27 19:54:23.405607", + "developer_mode_only": 0, + "disable_user_customization": 0, + "docstatus": 0, + "doctype": "Desk Page", + "extends_another_page": 0, + "hide_custom": 0, + "idx": 0, + "is_standard": 1, + "label": "Payroll", + "modified": "2020-06-19 12:23:06.034046", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Payroll", + "onboarding": "Payroll", + "owner": "Administrator", + "pin_to_bottom": 0, + "pin_to_top": 0, + "shortcuts": [ + { + "label": "Salary Structure", + "link_to": "Salary Structure", + "type": "DocType" + }, + { + "label": "Payroll Entry", + "link_to": "Payroll Entry", + "type": "DocType" + }, + { + "color": "", + "format": "{} Pending", + "label": "Salary Slip", + "link_to": "Salary Slip", + "stats_filter": "{\"status\": \"Draft\"}", + "type": "DocType" + }, + { + "label": "Income Tax Slab", + "link_to": "Income Tax Slab", + "type": "DocType" + }, + { + "label": "Salary Register", + "link_to": "Salary Register", + "type": "Report" + }, + { + "label": "Dashboard", + "link_to": "Payroll", + "type": "Dashboard" + } + ] +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_benefit_application/__init__.py b/erpnext/payroll/doctype/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_benefit_application/__init__.py rename to erpnext/payroll/doctype/__init__.py diff --git a/erpnext/hr/doctype/employee_benefit_application_detail/__init__.py b/erpnext/payroll/doctype/additional_salary/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_benefit_application_detail/__init__.py rename to erpnext/payroll/doctype/additional_salary/__init__.py diff --git a/erpnext/hr/doctype/additional_salary/additional_salary.js b/erpnext/payroll/doctype/additional_salary/additional_salary.js similarity index 100% rename from erpnext/hr/doctype/additional_salary/additional_salary.js rename to erpnext/payroll/doctype/additional_salary/additional_salary.js diff --git a/erpnext/hr/doctype/additional_salary/additional_salary.json b/erpnext/payroll/doctype/additional_salary/additional_salary.json similarity index 98% rename from erpnext/hr/doctype/additional_salary/additional_salary.json rename to erpnext/payroll/doctype/additional_salary/additional_salary.json index bfb543f49ad..ad64289f0d2 100644 --- a/erpnext/hr/doctype/additional_salary/additional_salary.json +++ b/erpnext/payroll/doctype/additional_salary/additional_salary.json @@ -146,7 +146,7 @@ "label": "To Date", "mandatory_depends_on": "eval:(doc.is_recurring==1)" }, - { + { "fieldname": "ref_doctype", "fieldtype": "Link", "label": "Reference Document Type", @@ -163,9 +163,9 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-04-04 18:06:29.170878", + "modified": "2020-05-27 21:10:50.374063", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Additional Salary", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/additional_salary/additional_salary.py b/erpnext/payroll/doctype/additional_salary/additional_salary.py similarity index 100% rename from erpnext/hr/doctype/additional_salary/additional_salary.py rename to erpnext/payroll/doctype/additional_salary/additional_salary.py diff --git a/erpnext/hr/doctype/additional_salary/test_additional_salary.js b/erpnext/payroll/doctype/additional_salary/test_additional_salary.js similarity index 100% rename from erpnext/hr/doctype/additional_salary/test_additional_salary.js rename to erpnext/payroll/doctype/additional_salary/test_additional_salary.js diff --git a/erpnext/hr/doctype/additional_salary/test_additional_salary.py b/erpnext/payroll/doctype/additional_salary/test_additional_salary.py similarity index 87% rename from erpnext/hr/doctype/additional_salary/test_additional_salary.py rename to erpnext/payroll/doctype/additional_salary/test_additional_salary.py index 6f93fb5df8d..de26543b571 100644 --- a/erpnext/hr/doctype/additional_salary/test_additional_salary.py +++ b/erpnext/payroll/doctype/additional_salary/test_additional_salary.py @@ -6,8 +6,8 @@ import unittest import frappe, erpnext from frappe.utils import nowdate, add_days from erpnext.hr.doctype.employee.test_employee import make_employee -from erpnext.hr.doctype.salary_component.test_salary_component import create_salary_component -from erpnext.hr.doctype.salary_slip.test_salary_slip import make_employee_salary_slip, setup_test +from erpnext.payroll.doctype.salary_component.test_salary_component import create_salary_component +from erpnext.payroll.doctype.salary_slip.test_salary_slip import make_employee_salary_slip, setup_test class TestAdditionalSalary(unittest.TestCase): diff --git a/erpnext/hr/doctype/employee_benefit_claim/__init__.py b/erpnext/payroll/doctype/employee_benefit_application/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_benefit_claim/__init__.py rename to erpnext/payroll/doctype/employee_benefit_application/__init__.py diff --git a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.js b/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.js similarity index 83% rename from erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.js rename to erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.js index b73dcf8ac36..f509df31e83 100644 --- a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.js +++ b/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.js @@ -6,7 +6,7 @@ frappe.ui.form.on('Employee Benefit Application', { frm.trigger('set_earning_component'); var method, args; if(frm.doc.employee && frm.doc.date && frm.doc.payroll_period){ - method = "erpnext.hr.doctype.employee_benefit_application.employee_benefit_application.get_max_benefits_remaining"; + method = "erpnext.payroll.doctype.employee_benefit_application.employee_benefit_application.get_max_benefits_remaining"; args = { employee: frm.doc.employee, on_date: frm.doc.date, @@ -15,7 +15,7 @@ frappe.ui.form.on('Employee Benefit Application', { get_max_benefits(frm, method, args); } else if(frm.doc.employee && frm.doc.date){ - method = "erpnext.hr.doctype.employee_benefit_application.employee_benefit_application.get_max_benefits"; + method = "erpnext.payroll.doctype.employee_benefit_application.employee_benefit_application.get_max_benefits"; args = { employee: frm.doc.employee, on_date: frm.doc.date @@ -32,7 +32,7 @@ frappe.ui.form.on('Employee Benefit Application', { if(!frm.doc.employee && !frm.doc.date) return; frm.set_query("earning_component", "employee_benefits", function() { return { - query : "erpnext.hr.doctype.employee_benefit_application.employee_benefit_application.get_earning_components", + query : "erpnext.payroll.doctype.employee_benefit_application.employee_benefit_application.get_earning_components", filters: {date: frm.doc.date, employee: frm.doc.employee} }; }); @@ -41,7 +41,7 @@ frappe.ui.form.on('Employee Benefit Application', { payroll_period: function(frm) { var method, args; if(frm.doc.employee && frm.doc.date && frm.doc.payroll_period){ - method = "erpnext.hr.doctype.employee_benefit_application.employee_benefit_application.get_max_benefits_remaining"; + method = "erpnext.payroll.doctype.employee_benefit_application.employee_benefit_application.get_max_benefits_remaining"; args = { employee: frm.doc.employee, on_date: frm.doc.date, diff --git a/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.json b/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.json new file mode 100644 index 00000000000..275c855b687 --- /dev/null +++ b/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.json @@ -0,0 +1,191 @@ +{ + "actions": [], + "allow_import": 1, + "allow_rename": 1, + "autoname": "HR-BEN-APP-.YY.-.MM.-.#####", + "creation": "2018-04-13 16:31:39.190787", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "employee", + "employee_name", + "max_benefits", + "remaining_benefit", + "column_break_2", + "date", + "payroll_period", + "department", + "amended_from", + "section_break_4", + "employee_benefits", + "totals", + "total_amount", + "pro_rata_dispensed_amount" + ], + "fields": [ + { + "fieldname": "employee", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Employee", + "options": "Employee", + "reqd": 1 + }, + { + "fetch_from": "employee.employee_name", + "fieldname": "employee_name", + "fieldtype": "Data", + "label": "Employee Name", + "read_only": 1 + }, + { + "fieldname": "max_benefits", + "fieldtype": "Currency", + "label": "Max Benefits (Yearly)", + "read_only": 1 + }, + { + "fieldname": "remaining_benefit", + "fieldtype": "Currency", + "label": "Remaining Benefits (Yearly)", + "read_only": 1 + }, + { + "fieldname": "column_break_2", + "fieldtype": "Column Break" + }, + { + "default": "Today", + "fieldname": "date", + "fieldtype": "Date", + "label": "Date", + "reqd": 1 + }, + { + "fieldname": "payroll_period", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Payroll Period", + "options": "Payroll Period", + "reqd": 1 + }, + { + "fetch_from": "employee.department", + "fieldname": "department", + "fieldtype": "Link", + "label": "Department", + "options": "Department", + "read_only": 1 + }, + { + "fieldname": "amended_from", + "fieldtype": "Link", + "label": "Amended From", + "no_copy": 1, + "options": "Employee Benefit Application", + "print_hide": 1, + "read_only": 1 + }, + { + "fieldname": "section_break_4", + "fieldtype": "Section Break", + "label": "Benefits Applied" + }, + { + "fieldname": "employee_benefits", + "fieldtype": "Table", + "label": "Employee Benefits", + "options": "Employee Benefit Application Detail", + "reqd": 1 + }, + { + "fieldname": "totals", + "fieldtype": "Section Break", + "label": "Totals" + }, + { + "fieldname": "total_amount", + "fieldtype": "Currency", + "label": "Total Amount", + "read_only": 1 + }, + { + "fieldname": "pro_rata_dispensed_amount", + "fieldtype": "Currency", + "label": "Dispensed Amount (Pro-rated)", + "read_only": 1 + } + ], + "is_submittable": 1, + "links": [], + "modified": "2020-05-27 22:58:31.271922", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Employee Benefit Application", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "share": 1, + "submit": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "share": 1, + "write": 1 + } + ], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "employee_name", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py b/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.py similarity index 97% rename from erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py rename to erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.py index feaa92590a3..e166a704d60 100644 --- a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py +++ b/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.py @@ -7,8 +7,8 @@ import frappe from frappe import _ from frappe.utils import date_diff, getdate, rounded, add_days, cstr, cint, flt from frappe.model.document import Document -from erpnext.hr.doctype.payroll_period.payroll_period import get_payroll_period_days, get_period_factor -from erpnext.hr.doctype.salary_structure_assignment.salary_structure_assignment import get_assigned_salary_structure +from erpnext.payroll.doctype.payroll_period.payroll_period import get_payroll_period_days, get_period_factor +from erpnext.payroll.doctype.salary_structure_assignment.salary_structure_assignment import get_assigned_salary_structure from erpnext.hr.utils import get_sal_slip_total_benefit_given, get_holidays_for_employee, get_previous_claimed_amount class EmployeeBenefitApplication(Document): diff --git a/erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.js b/erpnext/payroll/doctype/employee_benefit_application/test_employee_benefit_application.js similarity index 100% rename from erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.js rename to erpnext/payroll/doctype/employee_benefit_application/test_employee_benefit_application.js diff --git a/erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.py b/erpnext/payroll/doctype/employee_benefit_application/test_employee_benefit_application.py similarity index 100% rename from erpnext/hr/doctype/employee_benefit_application/test_employee_benefit_application.py rename to erpnext/payroll/doctype/employee_benefit_application/test_employee_benefit_application.py diff --git a/erpnext/hr/doctype/employee_incentive/__init__.py b/erpnext/payroll/doctype/employee_benefit_application_detail/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_incentive/__init__.py rename to erpnext/payroll/doctype/employee_benefit_application_detail/__init__.py diff --git a/erpnext/payroll/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json b/erpnext/payroll/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json new file mode 100644 index 00000000000..f0415d2b108 --- /dev/null +++ b/erpnext/payroll/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json @@ -0,0 +1,58 @@ +{ + "actions": [], + "creation": "2018-04-13 16:36:18.389786", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "earning_component", + "pay_against_benefit_claim", + "max_benefit_amount", + "amount" + ], + "fields": [ + { + "fieldname": "earning_component", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Earning Component", + "options": "Salary Component", + "reqd": 1 + }, + { + "default": "0", + "fetch_from": "earning_component.pay_against_benefit_claim", + "fieldname": "pay_against_benefit_claim", + "fieldtype": "Check", + "label": "Pay Against Benefit Claim", + "read_only": 1 + }, + { + "fetch_from": "earning_component.max_benefit_amount", + "fieldname": "max_benefit_amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Max Benefit Amount", + "read_only": 1 + }, + { + "fieldname": "amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Amount", + "reqd": 1 + } + ], + "istable": 1, + "links": [], + "modified": "2020-05-27 23:45:00.519134", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Employee Benefit Application Detail", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.py b/erpnext/payroll/doctype/employee_benefit_application_detail/employee_benefit_application_detail.py similarity index 73% rename from erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.py rename to erpnext/payroll/doctype/employee_benefit_application_detail/employee_benefit_application_detail.py index 3a502fe524c..65405feaf19 100644 --- a/erpnext/hr/doctype/employee_benefit_application_detail/employee_benefit_application_detail.py +++ b/erpnext/payroll/doctype/employee_benefit_application_detail/employee_benefit_application_detail.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt from __future__ import unicode_literals -import frappe +# import frappe from frappe.model.document import Document class EmployeeBenefitApplicationDetail(Document): diff --git a/erpnext/hr/doctype/employee_other_income/__init__.py b/erpnext/payroll/doctype/employee_benefit_claim/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_other_income/__init__.py rename to erpnext/payroll/doctype/employee_benefit_claim/__init__.py diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.js b/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.js similarity index 77% rename from erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.js rename to erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.js index 5e12828ba4c..6db6cb86b3d 100644 --- a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.js +++ b/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.js @@ -5,7 +5,7 @@ frappe.ui.form.on('Employee Benefit Claim', { setup: function(frm) { frm.set_query("earning_component", function() { return { - query : "erpnext.hr.doctype.employee_benefit_application.employee_benefit_application.get_earning_components", + query : "erpnext.payroll.doctype.employee_benefit_application.employee_benefit_application.get_earning_components", filters: {date: frm.doc.claim_date, employee: frm.doc.employee} }; }); diff --git a/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.json b/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.json new file mode 100644 index 00000000000..7fea59fabf4 --- /dev/null +++ b/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.json @@ -0,0 +1,194 @@ +{ + "actions": [], + "allow_import": 1, + "autoname": "HR-BEN-CLM-.YY.-.MM.-.#####", + "creation": "2018-04-13 16:43:10.386409", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "employee", + "employee_name", + "department", + "column_break_3", + "claim_date", + "benefit_type_and_amount", + "earning_component", + "max_amount_eligible", + "pay_against_benefit_claim", + "claimed_amount", + "salary_slip", + "amended_from", + "section_break_9", + "attachments" + ], + "fields": [ + { + "fieldname": "employee", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Employee", + "options": "Employee", + "reqd": 1 + }, + { + "fetch_from": "employee.employee_name", + "fieldname": "employee_name", + "fieldtype": "Data", + "label": "Employee Name", + "read_only": 1 + }, + { + "fetch_from": "employee.department", + "fieldname": "department", + "fieldtype": "Link", + "label": "Department", + "options": "Department", + "read_only": 1 + }, + { + "fieldname": "column_break_3", + "fieldtype": "Column Break" + }, + { + "default": "Today", + "fieldname": "claim_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Claim Date", + "reqd": 1 + }, + { + "fieldname": "benefit_type_and_amount", + "fieldtype": "Section Break", + "label": "Benefit Type and Amount" + }, + { + "fieldname": "earning_component", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Claim Benefit For", + "options": "Salary Component", + "reqd": 1 + }, + { + "fetch_from": "earning_component.max_benefit_amount", + "fieldname": "max_amount_eligible", + "fieldtype": "Currency", + "label": "Max Amount Eligible", + "read_only": 1 + }, + { + "default": "0", + "fetch_from": "earning_component.pay_against_benefit_claim", + "fieldname": "pay_against_benefit_claim", + "fieldtype": "Check", + "hidden": 1, + "label": "Pay Against Benefit Claim", + "read_only": 1 + }, + { + "fieldname": "claimed_amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Claimed Amount", + "reqd": 1 + }, + { + "fieldname": "salary_slip", + "fieldtype": "Link", + "label": "Salary Slip", + "options": "Salary Slip", + "read_only": 1 + }, + { + "fieldname": "amended_from", + "fieldtype": "Link", + "label": "Amended From", + "no_copy": 1, + "options": "Employee Benefit Claim", + "print_hide": 1, + "read_only": 1 + }, + { + "fieldname": "section_break_9", + "fieldtype": "Section Break", + "label": "Expense Proof" + }, + { + "fieldname": "attachments", + "fieldtype": "Attach", + "label": "Attachments" + } + ], + "is_submittable": 1, + "links": [], + "modified": "2020-05-27 23:01:50.791676", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Employee Benefit Claim", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "share": 1, + "submit": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "employee_name", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py b/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.py similarity index 96% rename from erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py rename to erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.py index 3a12c9c9f9c..d9937a7bb97 100644 --- a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py +++ b/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.py @@ -7,10 +7,10 @@ import frappe from frappe import _ from frappe.utils import flt from frappe.model.document import Document -from erpnext.hr.doctype.employee_benefit_application.employee_benefit_application import get_max_benefits +from erpnext.payroll.doctype.employee_benefit_application.employee_benefit_application import get_max_benefits from erpnext.hr.utils import get_previous_claimed_amount -from erpnext.hr.doctype.payroll_period.payroll_period import get_payroll_period -from erpnext.hr.doctype.salary_structure_assignment.salary_structure_assignment import get_assigned_salary_structure +from erpnext.payroll.doctype.payroll_period.payroll_period import get_payroll_period +from erpnext.payroll.doctype.salary_structure_assignment.salary_structure_assignment import get_assigned_salary_structure class EmployeeBenefitClaim(Document): def validate(self): diff --git a/erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.js b/erpnext/payroll/doctype/employee_benefit_claim/test_employee_benefit_claim.js similarity index 100% rename from erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.js rename to erpnext/payroll/doctype/employee_benefit_claim/test_employee_benefit_claim.js diff --git a/erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.py b/erpnext/payroll/doctype/employee_benefit_claim/test_employee_benefit_claim.py similarity index 100% rename from erpnext/hr/doctype/employee_benefit_claim/test_employee_benefit_claim.py rename to erpnext/payroll/doctype/employee_benefit_claim/test_employee_benefit_claim.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/__init__.py b/erpnext/payroll/doctype/employee_incentive/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_category/__init__.py rename to erpnext/payroll/doctype/employee_incentive/__init__.py diff --git a/erpnext/hr/doctype/employee_incentive/employee_incentive.js b/erpnext/payroll/doctype/employee_incentive/employee_incentive.js similarity index 100% rename from erpnext/hr/doctype/employee_incentive/employee_incentive.js rename to erpnext/payroll/doctype/employee_incentive/employee_incentive.js diff --git a/erpnext/hr/doctype/employee_incentive/employee_incentive.json b/erpnext/payroll/doctype/employee_incentive/employee_incentive.json similarity index 97% rename from erpnext/hr/doctype/employee_incentive/employee_incentive.json rename to erpnext/payroll/doctype/employee_incentive/employee_incentive.json index e2d8a11f47d..81ff86506a2 100644 --- a/erpnext/hr/doctype/employee_incentive/employee_incentive.json +++ b/erpnext/payroll/doctype/employee_incentive/employee_incentive.json @@ -74,9 +74,9 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-03-05 18:59:40.526014", + "modified": "2020-05-27 22:42:51.209630", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Employee Incentive", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/employee_incentive/employee_incentive.py b/erpnext/payroll/doctype/employee_incentive/employee_incentive.py similarity index 100% rename from erpnext/hr/doctype/employee_incentive/employee_incentive.py rename to erpnext/payroll/doctype/employee_incentive/employee_incentive.py diff --git a/erpnext/hr/doctype/employee_incentive/test_employee_incentive.js b/erpnext/payroll/doctype/employee_incentive/test_employee_incentive.js similarity index 100% rename from erpnext/hr/doctype/employee_incentive/test_employee_incentive.js rename to erpnext/payroll/doctype/employee_incentive/test_employee_incentive.js diff --git a/erpnext/hr/doctype/employee_incentive/test_employee_incentive.py b/erpnext/payroll/doctype/employee_incentive/test_employee_incentive.py similarity index 100% rename from erpnext/hr/doctype/employee_incentive/test_employee_incentive.py rename to erpnext/payroll/doctype/employee_incentive/test_employee_incentive.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/__init__.py b/erpnext/payroll/doctype/employee_other_income/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_declaration/__init__.py rename to erpnext/payroll/doctype/employee_other_income/__init__.py diff --git a/erpnext/hr/doctype/employee_other_income/employee_other_income.js b/erpnext/payroll/doctype/employee_other_income/employee_other_income.js similarity index 100% rename from erpnext/hr/doctype/employee_other_income/employee_other_income.js rename to erpnext/payroll/doctype/employee_other_income/employee_other_income.js diff --git a/erpnext/hr/doctype/employee_other_income/employee_other_income.json b/erpnext/payroll/doctype/employee_other_income/employee_other_income.json similarity index 97% rename from erpnext/hr/doctype/employee_other_income/employee_other_income.json rename to erpnext/payroll/doctype/employee_other_income/employee_other_income.json index 8abfe1e93a8..c5a2a73e423 100644 --- a/erpnext/hr/doctype/employee_other_income/employee_other_income.json +++ b/erpnext/payroll/doctype/employee_other_income/employee_other_income.json @@ -76,9 +76,9 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-05-14 17:17:38.883126", + "modified": "2020-05-27 22:55:17.604688", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Employee Other Income", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/employee_other_income/employee_other_income.py b/erpnext/payroll/doctype/employee_other_income/employee_other_income.py similarity index 100% rename from erpnext/hr/doctype/employee_other_income/employee_other_income.py rename to erpnext/payroll/doctype/employee_other_income/employee_other_income.py diff --git a/erpnext/hr/doctype/employee_other_income/test_employee_other_income.py b/erpnext/payroll/doctype/employee_other_income/test_employee_other_income.py similarity index 100% rename from erpnext/hr/doctype/employee_other_income/test_employee_other_income.py rename to erpnext/payroll/doctype/employee_other_income/test_employee_other_income.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration_category/__init__.py b/erpnext/payroll/doctype/employee_tax_exemption_category/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_declaration_category/__init__.py rename to erpnext/payroll/doctype/employee_tax_exemption_category/__init__.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.js b/erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.js similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.js rename to erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.js diff --git a/erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json b/erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json new file mode 100644 index 00000000000..c09708279a0 --- /dev/null +++ b/erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json @@ -0,0 +1,74 @@ +{ + "actions": [], + "allow_import": 1, + "allow_rename": 1, + "autoname": "Prompt", + "creation": "2018-04-13 16:51:36.971140", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "max_amount", + "is_active" + ], + "fields": [ + { + "fieldname": "max_amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Max Exemption Amount" + }, + { + "default": "1", + "fieldname": "is_active", + "fieldtype": "Check", + "label": "Is Active" + } + ], + "links": [], + "modified": "2020-05-27 23:16:47.472910", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Employee Tax Exemption Category", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC" +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.py b/erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_category/employee_tax_exemption_category.py rename to erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.js b/erpnext/payroll/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.js similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.js rename to erpnext/payroll/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.js diff --git a/erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py b/erpnext/payroll/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py rename to erpnext/payroll/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/__init__.py b/erpnext/payroll/doctype/employee_tax_exemption_declaration/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_proof_submission/__init__.py rename to erpnext/payroll/doctype/employee_tax_exemption_declaration/__init__.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.js b/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.js similarity index 88% rename from erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.js rename to erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.js index a827eca1c46..0e0c9b5a1ac 100644 --- a/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.js +++ b/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.js @@ -42,7 +42,7 @@ frappe.ui.form.on('Employee Tax Exemption Declaration', { if(frm.doc.docstatus==1) { frm.add_custom_button(__('Submit Proof'), function() { frappe.model.open_mapped_doc({ - method: "erpnext.hr.doctype.employee_tax_exemption_declaration.employee_tax_exemption_declaration.make_proof_submission", + method: "erpnext.payroll.doctype.employee_tax_exemption_declaration.employee_tax_exemption_declaration.make_proof_submission", frm: frm }); }).addClass("btn-primary"); diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json b/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json similarity index 98% rename from erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json rename to erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json index 18fad85c4b3..5423365bdb9 100644 --- a/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json +++ b/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json @@ -107,9 +107,9 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-03-18 14:56:25.625717", + "modified": "2020-05-27 22:49:43.829892", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Employee Tax Exemption Declaration", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py b/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py rename to erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.js b/erpnext/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.js similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.js rename to erpnext/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.js diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py b/erpnext/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py rename to erpnext/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/__init__.py b/erpnext/payroll/doctype/employee_tax_exemption_declaration_category/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/__init__.py rename to erpnext/payroll/doctype/employee_tax_exemption_declaration_category/__init__.py diff --git a/erpnext/payroll/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json b/erpnext/payroll/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json new file mode 100644 index 00000000000..eddaec28970 --- /dev/null +++ b/erpnext/payroll/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json @@ -0,0 +1,61 @@ +{ + "actions": [], + "creation": "2018-04-13 16:56:23.333041", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "exemption_sub_category", + "exemption_category", + "max_amount", + "amount" + ], + "fields": [ + { + "fieldname": "exemption_sub_category", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Exemption Sub Category", + "options": "Employee Tax Exemption Sub Category", + "reqd": 1 + }, + { + "fetch_from": "exemption_sub_category.exemption_category", + "fieldname": "exemption_category", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Exemption Category", + "options": "Employee Tax Exemption Category", + "read_only": 1, + "reqd": 1 + }, + { + "fetch_from": "exemption_sub_category.max_amount", + "fieldname": "max_amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Maximum Exempted Amount", + "read_only": 1, + "reqd": 1 + }, + { + "fieldname": "amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Declared Amount", + "reqd": 1 + } + ], + "istable": 1, + "links": [], + "modified": "2020-05-27 23:41:03.638739", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Employee Tax Exemption Declaration Category", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.py b/erpnext/payroll/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.py similarity index 73% rename from erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.py rename to erpnext/payroll/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.py index 362677e8872..bff747f90de 100644 --- a/erpnext/hr/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.py +++ b/erpnext/payroll/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt from __future__ import unicode_literals -import frappe +# import frappe from frappe.model.document import Document class EmployeeTaxExemptionDeclarationCategory(Document): diff --git a/erpnext/hr/doctype/employee_tax_exemption_sub_category/__init__.py b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/__init__.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_sub_category/__init__.py rename to erpnext/payroll/doctype/employee_tax_exemption_proof_submission/__init__.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.js b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.js similarity index 90% rename from erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.js rename to erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.js index 66118c08111..715d7553b00 100644 --- a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.js +++ b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.js @@ -43,7 +43,7 @@ frappe.ui.form.on('Employee Tax Exemption Proof Submission', { frm.add_custom_button(__('Get Details From Declaration'), function() { erpnext.utils.map_current_doc({ - method: "erpnext.hr.doctype.employee_tax_exemption_declaration.employee_tax_exemption_declaration.make_proof_submission", + method: "erpnext.payroll.doctype.employee_tax_exemption_declaration.employee_tax_exemption_declaration.make_proof_submission", source_doctype: "Employee Tax Exemption Declaration", target: frm, date_field: "creation", diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json similarity index 98% rename from erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json rename to erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json index 8b117a25b54..de8fa09a83b 100644 --- a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json +++ b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json @@ -130,9 +130,9 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-03-18 14:55:51.420016", + "modified": "2020-05-27 22:53:10.412321", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Employee Tax Exemption Proof Submission", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py rename to erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.js b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.js similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.js rename to erpnext/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.js diff --git a/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py new file mode 100644 index 00000000000..cb9ed5f971c --- /dev/null +++ b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest +from erpnext.payroll.doctype.employee_tax_exemption_declaration.test_employee_tax_exemption_declaration import create_exemption_category, create_payroll_period + +class TestEmployeeTaxExemptionProofSubmission(unittest.TestCase): + def setup(self): + make_employee("employee@proofsubmission.com") + create_payroll_period() + create_exemption_category() + frappe.db.sql("""delete from `tabEmployee Tax Exemption Proof Submission`""") + + def test_exemption_amount_lesser_than_category_max(self): + declaration = frappe.get_doc({ + "doctype": "Employee Tax Exemption Proof Submission", + "employee": frappe.get_value("Employee", {"user_id":"employee@proofsubmission.com"}, "name"), + "payroll_period": "Test Payroll Period", + "tax_exemption_proofs": [dict(exemption_sub_category = "_Test Sub Category", + type_of_proof = "Test Proof", + exemption_category = "_Test Category", + amount = 150000)] + }) + self.assertRaises(frappe.ValidationError, declaration.save) + declaration = frappe.get_doc({ + "doctype": "Employee Tax Exemption Proof Submission", + "payroll_period": "Test Payroll Period", + "employee": frappe.get_value("Employee", {"user_id":"employee@proofsubmission.com"}, "name"), + "tax_exemption_proofs": [dict(exemption_sub_category = "_Test Sub Category", + type_of_proof = "Test Proof", + exemption_category = "_Test Category", + amount = 100000)] + }) + self.assertTrue(declaration.save) + self.assertTrue(declaration.submit) + + def test_duplicate_category_in_proof_submission(self): + declaration = frappe.get_doc({ + "doctype": "Employee Tax Exemption Proof Submission", + "employee": frappe.get_value("Employee", {"user_id":"employee@proofsubmission.com"}, "name"), + "payroll_period": "Test Payroll Period", + "tax_exemption_proofs": [dict(exemption_sub_category = "_Test Sub Category", + exemption_category = "_Test Category", + type_of_proof = "Test Proof", + amount = 100000), + dict(exemption_sub_category = "_Test Sub Category", + exemption_category = "_Test Category", + amount = 50000), + ] + }) + self.assertRaises(frappe.ValidationError, declaration.save) diff --git a/erpnext/hr/doctype/income_tax_slab/__init__.py b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/__init__.py similarity index 100% rename from erpnext/hr/doctype/income_tax_slab/__init__.py rename to erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/__init__.py diff --git a/erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json new file mode 100644 index 00000000000..4c53bd3f5d1 --- /dev/null +++ b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json @@ -0,0 +1,66 @@ +{ + "actions": [], + "creation": "2018-04-13 17:19:03.006149", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "exemption_sub_category", + "exemption_category", + "max_amount", + "type_of_proof", + "amount" + ], + "fields": [ + { + "fieldname": "exemption_sub_category", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Exemption Sub Category", + "options": "Employee Tax Exemption Sub Category", + "reqd": 1 + }, + { + "fetch_from": "exemption_sub_category.exemption_category", + "fieldname": "exemption_category", + "fieldtype": "Read Only", + "in_list_view": 1, + "label": "Exemption Category", + "reqd": 1 + }, + { + "fetch_from": "exemption_sub_category.max_amount", + "fieldname": "max_amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Maximum Exemption Amount", + "read_only": 1, + "reqd": 1 + }, + { + "fieldname": "type_of_proof", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Type of Proof", + "reqd": 1 + }, + { + "fieldname": "amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Actual Amount" + } + ], + "istable": 1, + "links": [], + "modified": "2020-05-27 23:37:08.265600", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Employee Tax Exemption Proof Submission Detail", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.py b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.py similarity index 74% rename from erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.py rename to erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.py index c5d1a8fe5d9..0244ae66468 100644 --- a/erpnext/hr/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.py +++ b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt from __future__ import unicode_literals -import frappe +# import frappe from frappe.model.document import Document class EmployeeTaxExemptionProofSubmissionDetail(Document): diff --git a/erpnext/hr/doctype/income_tax_slab_other_charges/__init__.py b/erpnext/payroll/doctype/employee_tax_exemption_sub_category/__init__.py similarity index 100% rename from erpnext/hr/doctype/income_tax_slab_other_charges/__init__.py rename to erpnext/payroll/doctype/employee_tax_exemption_sub_category/__init__.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.js b/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.js similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.js rename to erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.js diff --git a/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json b/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json new file mode 100644 index 00000000000..b89d9c197f3 --- /dev/null +++ b/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json @@ -0,0 +1,86 @@ +{ + "actions": [], + "allow_import": 1, + "allow_rename": 1, + "autoname": "Prompt", + "creation": "2018-05-09 12:47:26.983095", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "exemption_category", + "max_amount", + "is_active" + ], + "fields": [ + { + "fieldname": "exemption_category", + "fieldtype": "Link", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Tax Exemption Category", + "options": "Employee Tax Exemption Category", + "reqd": 1 + }, + { + "fetch_from": "exemption_category.max_amount", + "fetch_if_empty": 1, + "fieldname": "max_amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Max Exemption Amount" + }, + { + "default": "1", + "fieldname": "is_active", + "fieldtype": "Check", + "label": "Is Active" + } + ], + "links": [], + "modified": "2020-05-27 23:18:08.254645", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Employee Tax Exemption Sub Category", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC" +} \ No newline at end of file diff --git a/erpnext/hr/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.py b/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.py rename to erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.py diff --git a/erpnext/hr/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.js b/erpnext/payroll/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.js similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.js rename to erpnext/payroll/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.js diff --git a/erpnext/hr/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.py b/erpnext/payroll/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.py similarity index 100% rename from erpnext/hr/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.py rename to erpnext/payroll/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.py diff --git a/erpnext/hr/doctype/payroll_employee_detail/__init__.py b/erpnext/payroll/doctype/income_tax_slab/__init__.py similarity index 100% rename from erpnext/hr/doctype/payroll_employee_detail/__init__.py rename to erpnext/payroll/doctype/income_tax_slab/__init__.py diff --git a/erpnext/hr/doctype/income_tax_slab/income_tax_slab.js b/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.js similarity index 100% rename from erpnext/hr/doctype/income_tax_slab/income_tax_slab.js rename to erpnext/payroll/doctype/income_tax_slab/income_tax_slab.js diff --git a/erpnext/hr/doctype/income_tax_slab/income_tax_slab.json b/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.json similarity index 97% rename from erpnext/hr/doctype/income_tax_slab/income_tax_slab.json rename to erpnext/payroll/doctype/income_tax_slab/income_tax_slab.json index f74315f32e9..72b43326c32 100644 --- a/erpnext/hr/doctype/income_tax_slab/income_tax_slab.json +++ b/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.json @@ -94,9 +94,9 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-04-29 15:08:21.436120", + "modified": "2020-05-27 20:27:13.425084", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Income Tax Slab", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/income_tax_slab/income_tax_slab.py b/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.py similarity index 100% rename from erpnext/hr/doctype/income_tax_slab/income_tax_slab.py rename to erpnext/payroll/doctype/income_tax_slab/income_tax_slab.py diff --git a/erpnext/hr/doctype/income_tax_slab/test_income_tax_slab.py b/erpnext/payroll/doctype/income_tax_slab/test_income_tax_slab.py similarity index 100% rename from erpnext/hr/doctype/income_tax_slab/test_income_tax_slab.py rename to erpnext/payroll/doctype/income_tax_slab/test_income_tax_slab.py diff --git a/erpnext/hr/doctype/payroll_entry/__init__.py b/erpnext/payroll/doctype/income_tax_slab_other_charges/__init__.py similarity index 100% rename from erpnext/hr/doctype/payroll_entry/__init__.py rename to erpnext/payroll/doctype/income_tax_slab_other_charges/__init__.py diff --git a/erpnext/hr/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.json b/erpnext/payroll/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.json similarity index 95% rename from erpnext/hr/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.json rename to erpnext/payroll/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.json index b23fb3dc317..2531c79828a 100644 --- a/erpnext/hr/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.json +++ b/erpnext/payroll/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.json @@ -14,18 +14,6 @@ "max_taxable_income" ], "fields": [ - { - "fieldname": "column_break_2", - "fieldtype": "Column Break" - }, - { - "columns": 2, - "fieldname": "min_taxable_income", - "fieldtype": "Currency", - "in_list_view": 1, - "label": "Min Taxable Income", - "options": "Company:company:default_currency" - }, { "columns": 4, "fieldname": "description", @@ -34,6 +22,10 @@ "label": "Description", "reqd": 1 }, + { + "fieldname": "column_break_2", + "fieldtype": "Column Break" + }, { "columns": 2, "fieldname": "percent", @@ -47,6 +39,14 @@ "fieldtype": "Section Break", "label": "Conditions" }, + { + "columns": 2, + "fieldname": "min_taxable_income", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Min Taxable Income", + "options": "Company:company:default_currency" + }, { "fieldname": "column_break_7", "fieldtype": "Column Break" @@ -62,9 +62,9 @@ ], "istable": 1, "links": [], - "modified": "2020-04-24 13:27:43.598967", + "modified": "2020-05-27 23:33:17.931912", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Income Tax Slab Other Charges", "owner": "Administrator", "permissions": [], diff --git a/erpnext/hr/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.py b/erpnext/payroll/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.py similarity index 100% rename from erpnext/hr/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.py rename to erpnext/payroll/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.py diff --git a/erpnext/hr/doctype/payroll_period/__init__.py b/erpnext/payroll/doctype/payroll_employee_detail/__init__.py similarity index 100% rename from erpnext/hr/doctype/payroll_period/__init__.py rename to erpnext/payroll/doctype/payroll_employee_detail/__init__.py diff --git a/erpnext/payroll/doctype/payroll_employee_detail/payroll_employee_detail.json b/erpnext/payroll/doctype/payroll_employee_detail/payroll_employee_detail.json new file mode 100644 index 00000000000..b22e5de3243 --- /dev/null +++ b/erpnext/payroll/doctype/payroll_employee_detail/payroll_employee_detail.json @@ -0,0 +1,66 @@ +{ + "actions": [], + "creation": "2017-11-30 06:07:33.477781", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "employee", + "employee_name", + "column_break_3", + "department", + "designation" + ], + "fields": [ + { + "fieldname": "employee", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Employee", + "options": "Employee", + "read_only": 1 + }, + { + "fetch_from": "employee.employee_name", + "fieldname": "employee_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Employee Name", + "read_only": 1 + }, + { + "fieldname": "column_break_3", + "fieldtype": "Column Break" + }, + { + "fetch_from": "employee.department", + "fieldname": "department", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Department", + "options": "Department", + "read_only": 1 + }, + { + "fetch_from": "employee.designation", + "fieldname": "designation", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Designation", + "read_only": 1 + } + ], + "istable": 1, + "links": [], + "modified": "2020-05-27 23:25:13.779032", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Payroll Employee Detail", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/payroll_employee_detail/payroll_employee_detail.py b/erpnext/payroll/doctype/payroll_employee_detail/payroll_employee_detail.py similarity index 100% rename from erpnext/hr/doctype/payroll_employee_detail/payroll_employee_detail.py rename to erpnext/payroll/doctype/payroll_employee_detail/payroll_employee_detail.py diff --git a/erpnext/hr/doctype/payroll_period_date/__init__.py b/erpnext/payroll/doctype/payroll_entry/__init__.py similarity index 100% rename from erpnext/hr/doctype/payroll_period_date/__init__.py rename to erpnext/payroll/doctype/payroll_entry/__init__.py diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.js b/erpnext/payroll/doctype/payroll_entry/payroll_entry.js similarity index 95% rename from erpnext/hr/doctype/payroll_entry/payroll_entry.js rename to erpnext/payroll/doctype/payroll_entry/payroll_entry.js index da25d7574e0..1ae3553b9b9 100644 --- a/erpnext/hr/doctype/payroll_entry/payroll_entry.js +++ b/erpnext/payroll/doctype/payroll_entry/payroll_entry.js @@ -84,7 +84,7 @@ frappe.ui.form.on('Payroll Entry', { add_bank_entry_button: function(frm) { frappe.call({ - method: 'erpnext.hr.doctype.payroll_entry.payroll_entry.payroll_entry_has_bank_entries', + method: 'erpnext.payroll.doctype.payroll_entry.payroll_entry.payroll_entry_has_bank_entries', args: { 'name': frm.doc.name }, @@ -170,7 +170,7 @@ frappe.ui.form.on('Payroll Entry', { set_start_end_dates: function (frm) { if (!frm.doc.salary_slip_based_on_timesheet) { frappe.call({ - method: 'erpnext.hr.doctype.payroll_entry.payroll_entry.get_start_end_dates', + method: 'erpnext.payroll.doctype.payroll_entry.payroll_entry.get_start_end_dates', args: { payroll_frequency: frm.doc.payroll_frequency, start_date: frm.doc.posting_date @@ -188,7 +188,7 @@ frappe.ui.form.on('Payroll Entry', { set_end_date: function(frm){ frappe.call({ - method: 'erpnext.hr.doctype.payroll_entry.payroll_entry.get_end_date', + method: 'erpnext.payroll.doctype.payroll_entry.payroll_entry.get_end_date', args: { frequency: frm.doc.payroll_frequency, start_date: frm.doc.start_date diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.json b/erpnext/payroll/doctype/payroll_entry/payroll_entry.json similarity index 98% rename from erpnext/hr/doctype/payroll_entry/payroll_entry.json rename to erpnext/payroll/doctype/payroll_entry/payroll_entry.json index 9356f3e7b3b..4888be29871 100644 --- a/erpnext/hr/doctype/payroll_entry/payroll_entry.json +++ b/erpnext/payroll/doctype/payroll_entry/payroll_entry.json @@ -1,4 +1,5 @@ { + "actions": [], "allow_copy": 1, "autoname": "HR-PRUN-.YYYY.-.#####", "creation": "2017-10-23 15:22:29.291323", @@ -260,9 +261,10 @@ ], "icon": "fa fa-cog", "is_submittable": 1, - "modified": "2019-09-12 15:46:31.436381", + "links": [], + "modified": "2020-05-27 20:06:06.953904", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Payroll Entry", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.py b/erpnext/payroll/doctype/payroll_entry/payroll_entry.py similarity index 99% rename from erpnext/hr/doctype/payroll_entry/payroll_entry.py rename to erpnext/payroll/doctype/payroll_entry/payroll_entry.py index 656de0170dd..e6bb708e418 100644 --- a/erpnext/hr/doctype/payroll_entry/payroll_entry.py +++ b/erpnext/payroll/doctype/payroll_entry/payroll_entry.py @@ -55,7 +55,7 @@ class PayrollEntry(Document): ifnull(salary_slip_based_on_timesheet,0) = %(salary_slip_based_on_timesheet)s {condition}""".format(condition=condition), {"company": self.company, "salary_slip_based_on_timesheet":self.salary_slip_based_on_timesheet}) - + if sal_struct: cond += "and t2.salary_structure IN %(sal_struct)s " cond += "and %(from_date)s >= t2.from_date" @@ -154,7 +154,7 @@ class PayrollEntry(Document): submit_salary_slips_for_employees(self, ss_list, publish_progress=False) def email_salary_slip(self, submitted_ss): - if frappe.db.get_single_value("HR Settings", "email_salary_slip_to_employee"): + if frappe.db.get_single_value("Payroll Settings", "email_salary_slip_to_employee"): for ss in submitted_ss: ss.email_salary_slip() @@ -170,7 +170,7 @@ class PayrollEntry(Document): def get_salary_components(self, component_type): salary_slips = self.get_sal_slip_list(ss_status = 1, as_dict = True) - if salary_slips: + if salary_slips: salary_components = frappe.db.sql(""" select ssd.salary_component, ssd.amount, ssd.parentfield, ss.payroll_cost_center from `tabSalary Slip` ss, `tabSalary Detail` ssd @@ -197,7 +197,7 @@ class PayrollEntry(Document): return account_details def get_account(self, component_dict = None): - account_dict = {} + account_dict = {} for key, amount in component_dict.items(): account = self.get_salary_component_account(key[0]) account_dict[(account, key[1])] = account_dict.get((account, key[1]), 0) + amount diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry_dashboard.py b/erpnext/payroll/doctype/payroll_entry/payroll_entry_dashboard.py similarity index 100% rename from erpnext/hr/doctype/payroll_entry/payroll_entry_dashboard.py rename to erpnext/payroll/doctype/payroll_entry/payroll_entry_dashboard.py diff --git a/erpnext/hr/doctype/payroll_entry/test_payroll_entry.js b/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.js similarity index 100% rename from erpnext/hr/doctype/payroll_entry/test_payroll_entry.js rename to erpnext/payroll/doctype/payroll_entry/test_payroll_entry.js diff --git a/erpnext/hr/doctype/payroll_entry/test_payroll_entry.py b/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py similarity index 96% rename from erpnext/hr/doctype/payroll_entry/test_payroll_entry.py rename to erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py index 3c318e78a24..b0f225d909d 100644 --- a/erpnext/hr/doctype/payroll_entry/test_payroll_entry.py +++ b/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py @@ -7,11 +7,11 @@ import frappe from dateutil.relativedelta import relativedelta from erpnext.accounts.utils import get_fiscal_year, getdate, nowdate from frappe.utils import add_months -from erpnext.hr.doctype.payroll_entry.payroll_entry import get_start_end_dates, get_end_date +from erpnext.payroll.doctype.payroll_entry.payroll_entry import get_start_end_dates, get_end_date from erpnext.hr.doctype.employee.test_employee import make_employee -from erpnext.hr.doctype.salary_slip.test_salary_slip import get_salary_component_account, \ +from erpnext.payroll.doctype.salary_slip.test_salary_slip import get_salary_component_account, \ make_earning_salary_component, make_deduction_salary_component, create_account -from erpnext.hr.doctype.salary_structure.test_salary_structure import make_salary_structure +from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure from erpnext.loan_management.doctype.loan.test_loan import create_loan, make_loan_disbursement_entry from erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import process_loan_interest_accrual_for_term_loans @@ -24,7 +24,7 @@ class TestPayrollEntry(unittest.TestCase): make_earning_salary_component(setup=True, company_list=["_Test Company"]) make_deduction_salary_component(setup=True, company_list=["_Test Company"]) - frappe.db.set_value("HR Settings", None, "email_salary_slip_to_employee", 0) + frappe.db.set_value("Payroll Settings", None, "email_salary_slip_to_employee", 0) def test_payroll_entry(self): # pylint: disable=no-self-use company = erpnext.get_default_company() diff --git a/erpnext/hr/doctype/payroll_entry/test_set_salary_components.js b/erpnext/payroll/doctype/payroll_entry/test_set_salary_components.js similarity index 100% rename from erpnext/hr/doctype/payroll_entry/test_set_salary_components.js rename to erpnext/payroll/doctype/payroll_entry/test_set_salary_components.js diff --git a/erpnext/hr/doctype/retention_bonus/__init__.py b/erpnext/payroll/doctype/payroll_period/__init__.py similarity index 100% rename from erpnext/hr/doctype/retention_bonus/__init__.py rename to erpnext/payroll/doctype/payroll_period/__init__.py diff --git a/erpnext/hr/doctype/payroll_period/payroll_period.js b/erpnext/payroll/doctype/payroll_period/payroll_period.js similarity index 100% rename from erpnext/hr/doctype/payroll_period/payroll_period.js rename to erpnext/payroll/doctype/payroll_period/payroll_period.js diff --git a/erpnext/hr/doctype/payroll_period/payroll_period.json b/erpnext/payroll/doctype/payroll_period/payroll_period.json similarity index 96% rename from erpnext/hr/doctype/payroll_period/payroll_period.json rename to erpnext/payroll/doctype/payroll_period/payroll_period.json index c0fa506e7f0..345a2415a2c 100644 --- a/erpnext/hr/doctype/payroll_period/payroll_period.json +++ b/erpnext/payroll/doctype/payroll_period/payroll_period.json @@ -53,9 +53,9 @@ } ], "links": [], - "modified": "2020-03-18 18:13:23.859980", + "modified": "2020-05-27 20:12:32.684189", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Payroll Period", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/payroll_period/payroll_period.py b/erpnext/payroll/doctype/payroll_period/payroll_period.py similarity index 97% rename from erpnext/hr/doctype/payroll_period/payroll_period.py rename to erpnext/payroll/doctype/payroll_period/payroll_period.py index 6956c382854..d7893d06572 100644 --- a/erpnext/hr/doctype/payroll_period/payroll_period.py +++ b/erpnext/payroll/doctype/payroll_period/payroll_period.py @@ -64,7 +64,7 @@ def get_payroll_period_days(start_date, end_date, employee, company=None): if len(payroll_period) > 0: actual_no_of_days = date_diff(getdate(payroll_period[0][2]), getdate(payroll_period[0][1])) + 1 working_days = actual_no_of_days - if not cint(frappe.db.get_value("HR Settings", None, "include_holidays_in_total_working_days")): + if not cint(frappe.db.get_value("Payroll Settings", None, "include_holidays_in_total_working_days")): holidays = get_holidays_for_employee(employee, getdate(payroll_period[0][1]), getdate(payroll_period[0][2])) working_days -= len(holidays) return payroll_period[0][0], working_days, actual_no_of_days diff --git a/erpnext/hr/doctype/payroll_period/payroll_period_dashboard.py b/erpnext/payroll/doctype/payroll_period/payroll_period_dashboard.py similarity index 100% rename from erpnext/hr/doctype/payroll_period/payroll_period_dashboard.py rename to erpnext/payroll/doctype/payroll_period/payroll_period_dashboard.py diff --git a/erpnext/hr/doctype/payroll_period/test_payroll_period.js b/erpnext/payroll/doctype/payroll_period/test_payroll_period.js similarity index 100% rename from erpnext/hr/doctype/payroll_period/test_payroll_period.js rename to erpnext/payroll/doctype/payroll_period/test_payroll_period.js diff --git a/erpnext/hr/doctype/payroll_period/test_payroll_period.py b/erpnext/payroll/doctype/payroll_period/test_payroll_period.py similarity index 100% rename from erpnext/hr/doctype/payroll_period/test_payroll_period.py rename to erpnext/payroll/doctype/payroll_period/test_payroll_period.py diff --git a/erpnext/hr/doctype/salary_component/__init__.py b/erpnext/payroll/doctype/payroll_period_date/__init__.py similarity index 100% rename from erpnext/hr/doctype/salary_component/__init__.py rename to erpnext/payroll/doctype/payroll_period_date/__init__.py diff --git a/erpnext/payroll/doctype/payroll_period_date/payroll_period_date.json b/erpnext/payroll/doctype/payroll_period_date/payroll_period_date.json new file mode 100644 index 00000000000..d745fcd5325 --- /dev/null +++ b/erpnext/payroll/doctype/payroll_period_date/payroll_period_date.json @@ -0,0 +1,39 @@ +{ + "actions": [], + "creation": "2018-04-13 15:17:30.513630", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "start_date", + "end_date" + ], + "fields": [ + { + "fieldname": "start_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Start Date", + "reqd": 1 + }, + { + "fieldname": "end_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "End Date", + "reqd": 1 + } + ], + "istable": 1, + "links": [], + "modified": "2020-05-27 23:30:15.943356", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Payroll Period Date", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/payroll_period_date/payroll_period_date.py b/erpnext/payroll/doctype/payroll_period_date/payroll_period_date.py similarity index 71% rename from erpnext/hr/doctype/payroll_period_date/payroll_period_date.py rename to erpnext/payroll/doctype/payroll_period_date/payroll_period_date.py index 06ecb495f31..a3ee269d8e6 100644 --- a/erpnext/hr/doctype/payroll_period_date/payroll_period_date.py +++ b/erpnext/payroll/doctype/payroll_period_date/payroll_period_date.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt from __future__ import unicode_literals -import frappe +# import frappe from frappe.model.document import Document class PayrollPeriodDate(Document): diff --git a/erpnext/hr/doctype/salary_detail/__init__.py b/erpnext/payroll/doctype/payroll_settings/__init__.py similarity index 100% rename from erpnext/hr/doctype/salary_detail/__init__.py rename to erpnext/payroll/doctype/payroll_settings/__init__.py diff --git a/erpnext/payroll/doctype/payroll_settings/payroll_settings.js b/erpnext/payroll/doctype/payroll_settings/payroll_settings.js new file mode 100644 index 00000000000..941464dc51f --- /dev/null +++ b/erpnext/payroll/doctype/payroll_settings/payroll_settings.js @@ -0,0 +1,19 @@ +// Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Payroll Settings', { + encrypt_salary_slips_in_emails: function(frm) { + let encrypt_state = frm.doc.encrypt_salary_slips_in_emails; + frm.set_df_property('password_policy', 'reqd', encrypt_state); + }, + + validate: function(frm) { + let policy = frm.doc.password_policy; + if (policy) { + if (policy.includes(' ') || policy.includes('--')) { + frappe.msgprint(__("Password policy cannot contain spaces or simultaneous hyphens. The format will be restructured automatically")); + } + frm.set_value('password_policy', policy.split(new RegExp(" |-", 'g')).filter((token) => token).join('-')); + } + }, +}); diff --git a/erpnext/payroll/doctype/payroll_settings/payroll_settings.json b/erpnext/payroll/doctype/payroll_settings/payroll_settings.json new file mode 100644 index 00000000000..e3b8b3e7e04 --- /dev/null +++ b/erpnext/payroll/doctype/payroll_settings/payroll_settings.json @@ -0,0 +1,130 @@ +{ + "actions": [], + "creation": "2020-06-04 15:13:33.589685", + "doctype": "DocType", + "document_type": "Other", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "payroll_based_on", + "consider_unmarked_attendance_as", + "max_working_hours_against_timesheet", + "include_holidays_in_total_working_days", + "disable_rounded_total", + "column_break_11", + "daily_wages_fraction_for_half_day", + "email_salary_slip_to_employee", + "encrypt_salary_slips_in_emails", + "password_policy" + ], + "fields": [ + { + "default": "Leave", + "fieldname": "payroll_based_on", + "fieldtype": "Select", + "label": "Calculate Payroll Working Days Based On", + "options": "Leave\nAttendance", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "max_working_hours_against_timesheet", + "fieldtype": "Float", + "label": "Max working hours against Timesheet", + "show_days": 1, + "show_seconds": 1 + }, + { + "default": "0", + "description": "If checked, Total no. of Working Days will include holidays, and this will reduce the value of Salary Per Day", + "fieldname": "include_holidays_in_total_working_days", + "fieldtype": "Check", + "label": "Include holidays in Total no. of Working Days", + "show_days": 1, + "show_seconds": 1 + }, + { + "default": "0", + "description": "If checked, hides and disables Rounded Total field in Salary Slips", + "fieldname": "disable_rounded_total", + "fieldtype": "Check", + "label": "Disable Rounded Total", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "column_break_11", + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 + }, + { + "default": "0.5", + "description": "The fraction of daily wages to be paid for half-day attendance", + "fieldname": "daily_wages_fraction_for_half_day", + "fieldtype": "Float", + "label": "Daily Wages Fraction for Half Day", + "show_days": 1, + "show_seconds": 1 + }, + { + "default": "1", + "description": "Emails salary slip to employee based on preferred email selected in Employee", + "fieldname": "email_salary_slip_to_employee", + "fieldtype": "Check", + "label": "Email Salary Slip to Employee", + "show_days": 1, + "show_seconds": 1 + }, + { + "default": "0", + "depends_on": "eval: doc.email_salary_slip_to_employee == 1;", + "description": "The salary slip emailed to the employee will be password protected, the password will be generated based on the password policy.", + "fieldname": "encrypt_salary_slips_in_emails", + "fieldtype": "Check", + "label": "Encrypt Salary Slips in Emails", + "show_days": 1, + "show_seconds": 1 + }, + { + "depends_on": "eval: doc.encrypt_salary_slips_in_emails == 1", + "description": "Example: SAL-{first_name}-{date_of_birth.year}
This will generate a password like SAL-Jane-1972", + "fieldname": "password_policy", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Password Policy", + "show_days": 1, + "show_seconds": 1 + }, + { + "depends_on": "eval:doc.payroll_based_on == 'Attendance'", + "fieldname": "consider_unmarked_attendance_as", + "fieldtype": "Select", + "label": "Consider Unmarked Attendance As", + "options": "Present\nAbsent", + "show_days": 1, + "show_seconds": 1 + } + ], + "icon": "fa fa-cog", + "issingle": 1, + "links": [], + "modified": "2020-06-05 12:35:34.861674", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Payroll Settings", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "email": 1, + "print": 1, + "read": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "ASC" +} \ No newline at end of file diff --git a/erpnext/payroll/doctype/payroll_settings/payroll_settings.py b/erpnext/payroll/doctype/payroll_settings/payroll_settings.py new file mode 100644 index 00000000000..5efa41db1f7 --- /dev/null +++ b/erpnext/payroll/doctype/payroll_settings/payroll_settings.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document +from frappe.utils import cint +from frappe.custom.doctype.property_setter.property_setter import make_property_setter +from frappe import _ + +class PayrollSettings(Document): + def validate(self): + self.validate_password_policy() + + if not self.daily_wages_fraction_for_half_day: + self.daily_wages_fraction_for_half_day = 0.5 + + def validate_password_policy(self): + if self.email_salary_slip_to_employee and self.encrypt_salary_slips_in_emails: + if not self.password_policy: + frappe.throw(_("Password policy for Salary Slips is not set")) + + + def on_update(self): + self.toggle_rounded_total() + frappe.clear_cache() + + def toggle_rounded_total(self): + self.disable_rounded_total = cint(self.disable_rounded_total) + make_property_setter("Salary Slip", "rounded_total", "hidden", self.disable_rounded_total, "Check") + make_property_setter("Salary Slip", "rounded_total", "print_hide", self.disable_rounded_total, "Check") diff --git a/erpnext/payroll/doctype/payroll_settings/test_payroll_settings.py b/erpnext/payroll/doctype/payroll_settings/test_payroll_settings.py new file mode 100644 index 00000000000..314866e128e --- /dev/null +++ b/erpnext/payroll/doctype/payroll_settings/test_payroll_settings.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestPayrollSettings(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/salary_slip_timesheet/__init__.py b/erpnext/payroll/doctype/retention_bonus/__init__.py similarity index 100% rename from erpnext/hr/doctype/salary_slip_timesheet/__init__.py rename to erpnext/payroll/doctype/retention_bonus/__init__.py diff --git a/erpnext/hr/doctype/retention_bonus/retention_bonus.js b/erpnext/payroll/doctype/retention_bonus/retention_bonus.js similarity index 100% rename from erpnext/hr/doctype/retention_bonus/retention_bonus.js rename to erpnext/payroll/doctype/retention_bonus/retention_bonus.js diff --git a/erpnext/hr/doctype/retention_bonus/retention_bonus.json b/erpnext/payroll/doctype/retention_bonus/retention_bonus.json similarity index 90% rename from erpnext/hr/doctype/retention_bonus/retention_bonus.json rename to erpnext/payroll/doctype/retention_bonus/retention_bonus.json index 7781053e137..53fe17f9f66 100644 --- a/erpnext/hr/doctype/retention_bonus/retention_bonus.json +++ b/erpnext/payroll/doctype/retention_bonus/retention_bonus.json @@ -1,4 +1,5 @@ { + "actions": [], "allow_import": 1, "allow_rename": 1, "autoname": "HR-RTB-.YYYY.-.#####", @@ -16,8 +17,7 @@ "column_break_6", "employee_name", "department", - "date_of_joining", - "additional_salary" + "date_of_joining" ], "fields": [ { @@ -83,14 +83,6 @@ "label": "Date of Joining", "read_only": 1 }, - { - "fieldname": "additional_salary", - "fieldtype": "Link", - "label": "Additional Salary", - "no_copy": 1, - "options": "Additional Salary", - "read_only": 1 - }, { "fieldname": "salary_component", "fieldtype": "Link", @@ -100,9 +92,10 @@ } ], "is_submittable": 1, - "modified": "2019-09-03 16:47:24.210422", + "links": [], + "modified": "2020-05-27 22:42:05.251951", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Retention Bonus", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/retention_bonus/retention_bonus.py b/erpnext/payroll/doctype/retention_bonus/retention_bonus.py similarity index 76% rename from erpnext/hr/doctype/retention_bonus/retention_bonus.py rename to erpnext/payroll/doctype/retention_bonus/retention_bonus.py index 48637a350cd..ed0d36cfa5f 100644 --- a/erpnext/hr/doctype/retention_bonus/retention_bonus.py +++ b/erpnext/payroll/doctype/retention_bonus/retention_bonus.py @@ -17,13 +17,7 @@ class RetentionBonus(Document): def on_submit(self): company = frappe.db.get_value('Employee', self.employee, 'company') - additional_salary = frappe.db.exists('Additional Salary', { - 'employee': self.employee, - 'salary_component': self.salary_component, - 'payroll_date': self.bonus_payment_date, - 'company': company, - 'docstatus': 1 - }) + additional_salary = self.get_additional_salary() if not additional_salary: additional_salary = frappe.new_doc('Additional Salary') @@ -32,8 +26,10 @@ class RetentionBonus(Document): additional_salary.amount = self.bonus_amount additional_salary.payroll_date = self.bonus_payment_date additional_salary.company = company + additional_salary.ref_doctype = self.doctype + additional_salary.ref_docname = self.name additional_salary.submit() - self.db_set('additional_salary', additional_salary.name) + # self.db_set('additional_salary', additional_salary.name) else: bonus_added = frappe.db.get_value('Additional Salary', additional_salary, 'amount') + self.bonus_amount @@ -41,11 +37,24 @@ class RetentionBonus(Document): self.db_set('additional_salary', additional_salary) def on_cancel(self): + + additional_salary = self.get_additional_salary() if self.additional_salary: bonus_removed = frappe.db.get_value('Additional Salary', self.additional_salary, 'amount') - self.bonus_amount if bonus_removed == 0: frappe.get_doc('Additional Salary', self.additional_salary).cancel() else: frappe.db.set_value('Additional Salary', self.additional_salary, 'amount', bonus_removed) - - self.db_set('additional_salary', '') \ No newline at end of file + + # self.db_set('additional_salary', '') + + def get_additional_salary(self): + return frappe.db.exists('Additional Salary', { + 'employee': self.employee, + 'salary_component': self.salary_component, + 'payroll_date': self.bonus_payment_date, + 'company': company, + 'docstatus': 1, + 'ref_doctype': self.doctype, + 'ref_docname': self.name + }) diff --git a/erpnext/hr/doctype/retention_bonus/test_retention_bonus.js b/erpnext/payroll/doctype/retention_bonus/test_retention_bonus.js similarity index 100% rename from erpnext/hr/doctype/retention_bonus/test_retention_bonus.js rename to erpnext/payroll/doctype/retention_bonus/test_retention_bonus.js diff --git a/erpnext/hr/doctype/retention_bonus/test_retention_bonus.py b/erpnext/payroll/doctype/retention_bonus/test_retention_bonus.py similarity index 100% rename from erpnext/hr/doctype/retention_bonus/test_retention_bonus.py rename to erpnext/payroll/doctype/retention_bonus/test_retention_bonus.py diff --git a/erpnext/hr/doctype/salary_component/README.md b/erpnext/payroll/doctype/salary_component/README.md similarity index 100% rename from erpnext/hr/doctype/salary_component/README.md rename to erpnext/payroll/doctype/salary_component/README.md diff --git a/erpnext/hr/doctype/salary_structure_assignment/__init__.py b/erpnext/payroll/doctype/salary_component/__init__.py similarity index 100% rename from erpnext/hr/doctype/salary_structure_assignment/__init__.py rename to erpnext/payroll/doctype/salary_component/__init__.py diff --git a/erpnext/hr/doctype/salary_component/salary_component.js b/erpnext/payroll/doctype/salary_component/salary_component.js similarity index 100% rename from erpnext/hr/doctype/salary_component/salary_component.js rename to erpnext/payroll/doctype/salary_component/salary_component.js diff --git a/erpnext/hr/doctype/salary_component/salary_component.json b/erpnext/payroll/doctype/salary_component/salary_component.json similarity index 95% rename from erpnext/hr/doctype/salary_component/salary_component.json rename to erpnext/payroll/doctype/salary_component/salary_component.json index 97c46c829e7..f1e5cf090dd 100644 --- a/erpnext/hr/doctype/salary_component/salary_component.json +++ b/erpnext/payroll/doctype/salary_component/salary_component.json @@ -16,6 +16,7 @@ "column_break_4", "depends_on_payment_days", "is_tax_applicable", + "is_income_tax_component", "deduct_full_tax_on_selected_payroll_date", "variable_based_on_taxable_salary", "exempted_from_income_tax", @@ -231,13 +232,22 @@ "fieldname": "exempted_from_income_tax", "fieldtype": "Check", "label": "Exempted from Income Tax" + }, + { + "default": "0", + "depends_on": "eval:doc.type == \"Deduction\"", + "fieldname": "is_income_tax_component", + "fieldtype": "Check", + "label": "Is Income Tax Component", + "show_days": 1, + "show_seconds": 1 } ], "icon": "fa fa-flag", "links": [], - "modified": "2020-04-28 15:46:45.252945", + "modified": "2020-06-01 15:39:20.826565", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Salary Component", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/salary_component/salary_component.py b/erpnext/payroll/doctype/salary_component/salary_component.py similarity index 100% rename from erpnext/hr/doctype/salary_component/salary_component.py rename to erpnext/payroll/doctype/salary_component/salary_component.py diff --git a/erpnext/hr/doctype/salary_component/test_records.json b/erpnext/payroll/doctype/salary_component/test_records.json similarity index 100% rename from erpnext/hr/doctype/salary_component/test_records.json rename to erpnext/payroll/doctype/salary_component/test_records.json diff --git a/erpnext/hr/doctype/salary_component/test_salary_component.js b/erpnext/payroll/doctype/salary_component/test_salary_component.js similarity index 100% rename from erpnext/hr/doctype/salary_component/test_salary_component.js rename to erpnext/payroll/doctype/salary_component/test_salary_component.js diff --git a/erpnext/hr/doctype/salary_component/test_salary_component.py b/erpnext/payroll/doctype/salary_component/test_salary_component.py similarity index 100% rename from erpnext/hr/doctype/salary_component/test_salary_component.py rename to erpnext/payroll/doctype/salary_component/test_salary_component.py diff --git a/erpnext/hr/doctype/taxable_salary_slab/__init__.py b/erpnext/payroll/doctype/salary_detail/__init__.py similarity index 100% rename from erpnext/hr/doctype/taxable_salary_slab/__init__.py rename to erpnext/payroll/doctype/salary_detail/__init__.py diff --git a/erpnext/hr/doctype/salary_detail/salary_detail.json b/erpnext/payroll/doctype/salary_detail/salary_detail.json similarity index 99% rename from erpnext/hr/doctype/salary_detail/salary_detail.json rename to erpnext/payroll/doctype/salary_detail/salary_detail.json index fe5f83b5328..b7d2bc12725 100644 --- a/erpnext/hr/doctype/salary_detail/salary_detail.json +++ b/erpnext/payroll/doctype/salary_detail/salary_detail.json @@ -211,13 +211,13 @@ ], "istable": 1, "links": [], - "modified": "2020-04-04 20:00:16.475295", + "modified": "2020-05-27 23:21:26.300951", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Salary Detail", "owner": "Administrator", "permissions": [], "quick_entry": 1, "sort_field": "modified", "sort_order": "DESC" -} +} \ No newline at end of file diff --git a/erpnext/hr/doctype/salary_detail/salary_detail.py b/erpnext/payroll/doctype/salary_detail/salary_detail.py similarity index 100% rename from erpnext/hr/doctype/salary_detail/salary_detail.py rename to erpnext/payroll/doctype/salary_detail/salary_detail.py diff --git a/erpnext/hr/doctype/salary_slip/README.md b/erpnext/payroll/doctype/salary_slip/README.md similarity index 100% rename from erpnext/hr/doctype/salary_slip/README.md rename to erpnext/payroll/doctype/salary_slip/README.md diff --git a/erpnext/hr/doctype/salary_slip/__init__.py b/erpnext/payroll/doctype/salary_slip/__init__.py similarity index 100% rename from erpnext/hr/doctype/salary_slip/__init__.py rename to erpnext/payroll/doctype/salary_slip/__init__.py diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.js b/erpnext/payroll/doctype/salary_slip/salary_slip.js similarity index 93% rename from erpnext/hr/doctype/salary_slip/salary_slip.js rename to erpnext/payroll/doctype/salary_slip/salary_slip.js index 1c4d4e34c56..4b623e57b48 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.js +++ b/erpnext/payroll/doctype/salary_slip/salary_slip.js @@ -56,7 +56,7 @@ frappe.ui.form.on("Salary Slip", { set_end_date: function(frm){ frappe.call({ - method: 'erpnext.hr.doctype.payroll_entry.payroll_entry.get_end_date', + method: 'erpnext.payroll.doctype.payroll_entry.payroll_entry.get_end_date', args: { frequency: frm.doc.payroll_frequency, start_date: frm.doc.start_date @@ -123,6 +123,9 @@ frappe.ui.form.on("Salary Slip", { doc: frm.doc, callback: function(r, rt) { frm.refresh(); + if (frm.doc.absent_days){ + frm.fields_dict.absent_days.set_description("Unmarked Days is treated as "+ r.message +". You can can change this in " + frappe.utils.get_form_link("Payroll Settings", "Payroll Settings", true)); + } } }); } diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.json b/erpnext/payroll/doctype/salary_slip/salary_slip.json similarity index 70% rename from erpnext/hr/doctype/salary_slip/salary_slip.json rename to erpnext/payroll/doctype/salary_slip/salary_slip.json index cfd4d897314..a6337deef58 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.json +++ b/erpnext/payroll/doctype/salary_slip/salary_slip.json @@ -23,11 +23,13 @@ "salary_slip_based_on_timesheet", "start_date", "end_date", - "column_break_15", "salary_structure", "payroll_frequency", + "column_break_15", "total_working_days", + "unmarked_days", "leave_without_pay", + "absent_days", "payment_days", "hourly_wages", "timesheets", @@ -37,6 +39,7 @@ "section_break_26", "bank_name", "bank_account_no", + "mode_of_payment", "section_break_32", "deduct_tax_for_unclaimed_employee_benefits", "deduct_tax_for_unsubmitted_tax_exemption_proof", @@ -71,7 +74,9 @@ "fieldtype": "Date", "in_list_view": 1, "label": "Posting Date", - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "employee", @@ -84,7 +89,9 @@ "oldfieldtype": "Link", "options": "Employee", "reqd": 1, - "search_index": 1 + "search_index": 1, + "show_days": 1, + "show_seconds": 1 }, { "fetch_from": "employee.employee_name", @@ -95,7 +102,9 @@ "label": "Employee Name", "oldfieldname": "employee_name", "oldfieldtype": "Data", - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fetch_from": "employee.department", @@ -106,7 +115,9 @@ "oldfieldname": "department", "oldfieldtype": "Link", "options": "Department", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:doc.designation", @@ -115,7 +126,9 @@ "fieldtype": "Read Only", "label": "Designation", "oldfieldname": "designation", - "oldfieldtype": "Link" + "oldfieldtype": "Link", + "show_days": 1, + "show_seconds": 1 }, { "fetch_from": "employee.branch", @@ -126,12 +139,16 @@ "oldfieldname": "branch", "oldfieldtype": "Link", "options": "Branch", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break1", "fieldtype": "Column Break", "oldfieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1, "width": "50%" }, { @@ -139,21 +156,27 @@ "fieldtype": "Select", "label": "Status", "options": "Draft\nSubmitted\nCancelled", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "journal_entry", "fieldtype": "Link", "label": "Journal Entry", "options": "Journal Entry", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "payroll_entry", "fieldtype": "Link", "label": "Payroll Entry", "options": "Payroll Entry", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "company", @@ -163,7 +186,9 @@ "label": "Company", "options": "Company", "remember_last_selected_value": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -172,46 +197,62 @@ "ignore_user_permissions": 1, "label": "Letter Head", "options": "Letter Head", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "section_break_10", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "salary_slip_based_on_timesheet", "fieldtype": "Check", "label": "Salary Slip Based on Timesheet", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "start_date", "fieldtype": "Date", - "label": "Start Date" + "label": "Start Date", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "end_date", "fieldtype": "Date", - "label": "End Date" + "label": "End Date", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_15", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "salary_structure", "fieldtype": "Link", "label": "Salary Structure", "options": "Salary Structure", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:(!doc.salary_slip_based_on_timesheet)", "fieldname": "payroll_frequency", "fieldtype": "Select", "label": "Payroll Frequency", - "options": "\nMonthly\nFortnightly\nBimonthly\nWeekly\nDaily" + "options": "\nMonthly\nFortnightly\nBimonthly\nWeekly\nDaily", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total_working_days", @@ -220,14 +261,18 @@ "oldfieldname": "total_days_in_month", "oldfieldtype": "Int", "read_only": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "leave_without_pay", "fieldtype": "Float", "label": "Leave Without Pay", "oldfieldname": "leave_without_pay", - "oldfieldtype": "Currency" + "oldfieldtype": "Currency", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "payment_days", @@ -236,38 +281,52 @@ "oldfieldname": "payment_days", "oldfieldtype": "Float", "read_only": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "hourly_wages", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "timesheets", "fieldtype": "Table", "label": "Salary Slip Timesheet", - "options": "Salary Slip Timesheet" + "options": "Salary Slip Timesheet", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_20", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total_working_hours", "fieldtype": "Float", "label": "Total Working Hours", - "print_hide_if_no_value": 1 + "print_hide_if_no_value": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "hour_rate", "fieldtype": "Currency", "label": "Hour Rate", "options": "Company:company:default_currency", - "print_hide_if_no_value": 1 + "print_hide_if_no_value": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "section_break_26", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "bank_name", @@ -275,7 +334,9 @@ "label": "Bank Name", "oldfieldname": "bank_name", "oldfieldtype": "Data", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "bank_account_no", @@ -283,35 +344,47 @@ "label": "Bank Account No.", "oldfieldname": "bank_account_no", "oldfieldtype": "Data", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "section_break_32", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "deduct_tax_for_unclaimed_employee_benefits", "fieldtype": "Check", - "label": "Deduct Tax For Unclaimed Employee Benefits" + "label": "Deduct Tax For Unclaimed Employee Benefits", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "deduct_tax_for_unsubmitted_tax_exemption_proof", "fieldtype": "Check", - "label": "Deduct Tax For Unsubmitted Tax Exemption Proof" + "label": "Deduct Tax For Unsubmitted Tax Exemption Proof", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "earning_deduction", "fieldtype": "Section Break", "label": "Earning & Deduction", - "oldfieldtype": "Section Break" + "oldfieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "earning", "fieldtype": "Column Break", "label": "Earning", "oldfieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1, "width": "50%" }, { @@ -320,13 +393,17 @@ "label": "Earnings", "oldfieldname": "earning_details", "oldfieldtype": "Table", - "options": "Salary Detail" + "options": "Salary Detail", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "deduction", "fieldtype": "Column Break", "label": "Deduction", "oldfieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1, "width": "50%" }, { @@ -335,12 +412,16 @@ "label": "Deductions", "oldfieldname": "deduction_details", "oldfieldtype": "Table", - "options": "Salary Detail" + "options": "Salary Detail", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "totals", "fieldtype": "Section Break", - "oldfieldtype": "Section Break" + "oldfieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "gross_pay", @@ -349,11 +430,15 @@ "oldfieldname": "gross_pay", "oldfieldtype": "Currency", "options": "Company:company:default_currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_25", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total_deduction", @@ -362,24 +447,32 @@ "oldfieldname": "total_deduction", "oldfieldtype": "Currency", "options": "Company:company:default_currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "total_loan_repayment", "fieldname": "loan_repayment", "fieldtype": "Section Break", - "label": "Loan repayment" + "label": "Loan repayment", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "loans", "fieldtype": "Table", "label": "Employee Loan", "options": "Salary Slip Loan", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "section_break_43", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", @@ -387,7 +480,9 @@ "fieldtype": "Currency", "label": "Total Principal Amount", "options": "Company:company:default_currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": "0", @@ -395,11 +490,15 @@ "fieldtype": "Currency", "label": "Total Interest Amount", "options": "Company:company:default_currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_45", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", @@ -407,12 +506,16 @@ "fieldtype": "Currency", "label": "Total Loan Repayment", "options": "Company:company:default_currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "net_pay_info", "fieldtype": "Section Break", - "label": "net pay info" + "label": "net pay info", + "show_days": 1, + "show_seconds": 1 }, { "description": "Gross Pay - Total Deduction - Loan Repayment", @@ -422,11 +525,15 @@ "oldfieldname": "net_pay", "oldfieldtype": "Currency", "options": "Company:company:default_currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_53", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -434,11 +541,15 @@ "fieldtype": "Currency", "label": "Rounded Total", "options": "Company:company:default_currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "section_break_55", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "description": "Net Pay (in words) will be visible once you save the Salary Slip.", @@ -447,7 +558,9 @@ "label": "Total in words", "oldfieldname": "net_pay_in_words", "oldfieldtype": "Data", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "amended_from", @@ -459,7 +572,9 @@ "oldfieldtype": "Data", "options": "Salary Slip", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fetch_from": "employee.payroll_cost_center", @@ -468,16 +583,42 @@ "fieldtype": "Link", "label": "Payroll Cost Center", "options": "Cost Center", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "mode_of_payment", + "fieldtype": "Select", + "label": "Mode Of Payment", + "read_only": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "absent_days", + "fieldtype": "Float", + "label": "Absent Days", + "read_only": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "unmarked_days", + "fieldtype": "Float", + "hidden": 1, + "label": "Unmarked days", + "show_days": 1, + "show_seconds": 1 } ], "icon": "fa fa-file-text", "idx": 9, "is_submittable": 1, "links": [], - "modified": "2020-05-05 18:55:26.173629", + "modified": "2020-06-05 14:42:43.921828", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Salary Slip", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/payroll/doctype/salary_slip/salary_slip.py similarity index 92% rename from erpnext/hr/doctype/salary_slip/salary_slip.py rename to erpnext/payroll/doctype/salary_slip/salary_slip.py index 4d5c8437c67..2da19b03978 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.py +++ b/erpnext/payroll/doctype/salary_slip/salary_slip.py @@ -9,14 +9,14 @@ from frappe.utils import add_days, cint, cstr, flt, getdate, rounded, date_diff, from frappe.model.naming import make_autoname from frappe import msgprint, _ -from erpnext.hr.doctype.payroll_entry.payroll_entry import get_start_end_dates +from erpnext.payroll.doctype.payroll_entry.payroll_entry import get_start_end_dates from erpnext.hr.doctype.employee.employee import get_holiday_list_for_employee from erpnext.utilities.transaction_base import TransactionBase from frappe.utils.background_jobs import enqueue -from erpnext.hr.doctype.additional_salary.additional_salary import get_additional_salary_component -from erpnext.hr.doctype.payroll_period.payroll_period import get_period_factor, get_payroll_period -from erpnext.hr.doctype.employee_benefit_application.employee_benefit_application import get_benefit_component_amount -from erpnext.hr.doctype.employee_benefit_claim.employee_benefit_claim import get_benefit_claim_amount, get_last_payroll_period_benefits +from erpnext.payroll.doctype.additional_salary.additional_salary import get_additional_salary_component +from erpnext.payroll.doctype.payroll_period.payroll_period import get_period_factor, get_payroll_period +from erpnext.payroll.doctype.employee_benefit_application.employee_benefit_application import get_benefit_component_amount +from erpnext.payroll.doctype.employee_benefit_claim.employee_benefit_claim import get_benefit_claim_amount, get_last_payroll_period_benefits from erpnext.loan_management.doctype.loan_repayment.loan_repayment import calculate_amounts, create_repayment_entry class SalarySlip(TransactionBase): @@ -54,8 +54,8 @@ class SalarySlip(TransactionBase): total = self.net_pay if self.is_rounding_total_disabled() else self.rounded_total self.total_in_words = money_in_words(total, company_currency) - if frappe.db.get_single_value("HR Settings", "max_working_hours_against_timesheet"): - max_working_hours = frappe.db.get_single_value("HR Settings", "max_working_hours_against_timesheet") + if frappe.db.get_single_value("Payroll Settings", "max_working_hours_against_timesheet"): + max_working_hours = frappe.db.get_single_value("Payroll Settings", "max_working_hours_against_timesheet") if self.salary_slip_based_on_timesheet and (self.total_working_hours > int(max_working_hours)): frappe.msgprint(_("Total working hours should not be greater than max working hours {0}"). format(max_working_hours), alert=True) @@ -67,7 +67,7 @@ class SalarySlip(TransactionBase): self.set_status() self.update_status(self.name) self.make_loan_repayment_entry() - if (frappe.db.get_single_value("HR Settings", "email_salary_slip_to_employee")) and not frappe.flags.via_payroll_entry: + if (frappe.db.get_single_value("Payroll Settings", "email_salary_slip_to_employee")) and not frappe.flags.via_payroll_entry: self.email_salary_slip() def on_cancel(self): @@ -93,7 +93,7 @@ class SalarySlip(TransactionBase): frappe.throw(_("To date cannot be before From date")) def is_rounding_total_disabled(self): - return cint(frappe.db.get_single_value("HR Settings", "disable_rounded_total")) + return cint(frappe.db.get_single_value("Payroll Settings", "disable_rounded_total")) def check_existing(self): if not self.salary_slip_based_on_timesheet: @@ -136,6 +136,8 @@ class SalarySlip(TransactionBase): self.salary_slip_based_on_timesheet = self._salary_structure_doc.salary_slip_based_on_timesheet or 0 self.set_time_sheet() self.pull_sal_struct() + consider_unmarked_attendance_as = frappe.db.get_value("Payroll Settings", None, "consider_unmarked_attendance_as") or "Present" + return consider_unmarked_attendance_as def set_time_sheet(self): if self.salary_slip_based_on_timesheet: @@ -175,7 +177,7 @@ class SalarySlip(TransactionBase): .format(self.employee), title=_('Salary Structure Missing')) def pull_sal_struct(self): - from erpnext.hr.doctype.salary_structure.salary_structure import make_salary_slip + from erpnext.payroll.doctype.salary_structure.salary_structure import make_salary_slip if self.salary_slip_based_on_timesheet: self.salary_structure = self._salary_structure_doc.name @@ -188,8 +190,8 @@ class SalarySlip(TransactionBase): make_salary_slip(self._salary_structure_doc.name, self) def get_working_days_details(self, joining_date=None, relieving_date=None, lwp=None, for_preview=0): - payroll_based_on = frappe.db.get_value("HR Settings", None, "payroll_based_on") - include_holidays_in_total_working_days = frappe.db.get_single_value("HR Settings", "include_holidays_in_total_working_days") + payroll_based_on = frappe.db.get_value("Payroll Settings", None, "payroll_based_on") + include_holidays_in_total_working_days = frappe.db.get_single_value("Payroll Settings", "include_holidays_in_total_working_days") working_days = date_diff(self.end_date, self.start_date) + 1 if for_preview: @@ -198,7 +200,7 @@ class SalarySlip(TransactionBase): return holidays = self.get_holidays_for_employee(self.start_date, self.end_date) - + if not cint(include_holidays_in_total_working_days): working_days -= len(holidays) if working_days < 0: @@ -206,9 +208,10 @@ class SalarySlip(TransactionBase): if not payroll_based_on: frappe.throw(_("Please set Payroll based on in HR settings")) - + if payroll_based_on == "Attendance": - actual_lwp = self.calculate_lwp_based_on_attendance(holidays) + actual_lwp, absent = self.calculate_lwp_and_absent_days_based_on_attendance(holidays) + self.absent_days = absent else: actual_lwp = self.calculate_lwp_based_on_leave_application(holidays, working_days) @@ -226,9 +229,36 @@ class SalarySlip(TransactionBase): if flt(payment_days) > flt(lwp): self.payment_days = flt(payment_days) - flt(lwp) + + if payroll_based_on == "Attendance": + self.payment_days -= flt(absent) + + unmarked_days = self.get_unmarked_days() + consider_unmarked_attendance_as = frappe.db.get_value("Payroll Settings", None, "consider_unmarked_attendance_as") or "Present" + + if payroll_based_on == "Attendance" and consider_unmarked_attendance_as =="Absent": + self.absent_days += unmarked_days #will be treated as absent + self.payment_days -= unmarked_days + if include_holidays_in_total_working_days: + self.absent_days -= len(holidays) + for holiday in holidays: + if not frappe.db.exists("Attendance", {"employee": self.employee, "attendance_date": holiday, "docstatus": 1 }): + self.payment_days += 1 + + else: self.payment_days = 0 + def get_unmarked_days(self): + marked_days = frappe.get_all("Attendance", filters = { + "attendance_date": ["between", ['2020-05-1',"2020-05-30"]], + "employee": 'HR-EMP-00003', + "docstatus": 1 + }, fields = ["COUNT(*) as marked_days"])[0].marked_days + + return self.total_working_days - marked_days + + def get_payment_days(self, joining_date, relieving_date, include_holidays_in_total_working_days): if not joining_date: joining_date, relieving_date = frappe.get_cached_value("Employee", self.employee, @@ -277,7 +307,7 @@ class SalarySlip(TransactionBase): lwp = 0 holidays = "','".join(holidays) daily_wages_fraction_for_half_day = \ - flt(frappe.db.get_value("HR Settings", None, "daily_wages_fraction_for_half_day")) or 0.5 + flt(frappe.db.get_value("Payroll Settings", None, "daily_wages_fraction_for_half_day")) or 0.5 for d in range(working_days): dt = add_days(cstr(getdate(self.start_date)), d) @@ -304,15 +334,15 @@ class SalarySlip(TransactionBase): lwp += (1 - daily_wages_fraction_for_half_day) if is_half_day_leave else 1 return lwp - - def calculate_lwp_based_on_attendance(self, holidays): + + def calculate_lwp_and_absent_days_based_on_attendance(self, holidays): lwp = 0 + absent = 0 daily_wages_fraction_for_half_day = \ - flt(frappe.db.get_value("HR Settings", None, "daily_wages_fraction_for_half_day")) or 0.5 + flt(frappe.db.get_value("Payroll Settings", None, "daily_wages_fraction_for_half_day")) or 0.5 lwp_leave_types = dict(frappe.get_all("Leave Type", {"is_lwp": 1}, ["name", "include_holiday"], as_list=1)) - attendances = frappe.db.sql(''' SELECT attendance_date, status, leave_type FROM `tabAttendance` @@ -322,7 +352,7 @@ class SalarySlip(TransactionBase): AND docstatus = 1 AND attendance_date between %s and %s ''', values=(self.employee, self.start_date, self.end_date), as_dict=1) - + for d in attendances: if d.status in ('Half Day', 'On Leave') and d.leave_type and d.leave_type not in lwp_leave_types: continue @@ -332,9 +362,14 @@ class SalarySlip(TransactionBase): (d.leave_type and d.leave_type in lwp_leave_types and not lwp_leave_types[d.leave_type]): continue - lwp += (1 - daily_wages_fraction_for_half_day) if d.status == "Half Day" else 1 + if d.status == "Half Day": + lwp += (1 - daily_wages_fraction_for_half_day) + elif d.status == "On Leave" and d.leave_type in lwp_leave_types: + lwp += 1 + elif d.status == "Absent": + absent += 1 - return lwp + return lwp, absent def add_earning_for_hourly_wages(self, doc, salary_component, amount): row_exists = False @@ -578,7 +613,7 @@ class SalarySlip(TransactionBase): # Total taxable earnings including additional and other incomes total_taxable_earnings = previous_taxable_earnings + current_structured_taxable_earnings + future_structured_taxable_earnings \ + current_additional_earnings + other_incomes + unclaimed_taxable_benefits - total_exemption_amount - + # Total taxable earnings without additional earnings with full tax total_taxable_earnings_without_full_tax_addl_components = total_taxable_earnings - current_additional_earnings_with_full_tax @@ -586,7 +621,7 @@ class SalarySlip(TransactionBase): total_structured_tax_amount = self.calculate_tax_by_tax_slab( total_taxable_earnings_without_full_tax_addl_components, tax_slab) current_structured_tax_amount = (total_structured_tax_amount - previous_total_paid_taxes) / remaining_sub_periods - + # Total taxable earnings with additional earnings with full tax full_tax_on_additional_earnings = 0.0 if current_additional_earnings_with_full_tax: @@ -622,7 +657,7 @@ class SalarySlip(TransactionBase): select sum(sd.amount) from `tabSalary Detail` sd join `tabSalary Slip` ss on sd.parent=ss.name - where + where sd.parentfield='earnings' and sd.is_tax_applicable=1 and is_flexible_benefit=0 @@ -841,7 +876,7 @@ class SalarySlip(TransactionBase): if flt(d.max_taxable_income) and flt(d.max_taxable_income) < tax_amount: continue - + tax_amount += tax_amount * flt(d.percent) / 100 return tax_amount @@ -955,13 +990,13 @@ class SalarySlip(TransactionBase): def email_salary_slip(self): receiver = frappe.db.get_value("Employee", self.employee, "prefered_email") - hr_settings = frappe.get_single("HR Settings") + payroll_settings = frappe.get_single("Payroll Settings") message = "Please see attachment" password = None - if hr_settings.encrypt_salary_slips_in_emails: - password = generate_password_for_pdf(hr_settings.password_policy, self.employee) + if payroll_settings.encrypt_salary_slips_in_emails: + password = generate_password_for_pdf(payroll_settings.password_policy, self.employee) message += """
Note: Your salary slip is password protected, - the password to unlock the PDF is of the format {0}. """.format(hr_settings.password_policy) + the password to unlock the PDF is of the format {0}. """.format(payroll_settings.password_policy) if receiver: email_args = { @@ -1004,8 +1039,9 @@ class SalarySlip(TransactionBase): self.calculate_net_pay() def pull_emp_details(self): - emp = frappe.db.get_value("Employee", self.employee, ["bank_name", "bank_ac_no"], as_dict=1) + emp = frappe.db.get_value("Employee", self.employee, ["bank_name", "bank_ac_no", "salary_mode"], as_dict=1) if emp: + self.mode_of_payment = emp.salary_mode self.bank_name = emp.bank_name self.bank_account_no = emp.bank_ac_no diff --git a/erpnext/hr/doctype/salary_slip/salary_slip_list.js b/erpnext/payroll/doctype/salary_slip/salary_slip_list.js similarity index 100% rename from erpnext/hr/doctype/salary_slip/salary_slip_list.js rename to erpnext/payroll/doctype/salary_slip/salary_slip_list.js diff --git a/erpnext/hr/doctype/salary_slip/test_salary_slip.js b/erpnext/payroll/doctype/salary_slip/test_salary_slip.js similarity index 100% rename from erpnext/hr/doctype/salary_slip/test_salary_slip.js rename to erpnext/payroll/doctype/salary_slip/test_salary_slip.js diff --git a/erpnext/hr/doctype/salary_slip/test_salary_slip.py b/erpnext/payroll/doctype/salary_slip/test_salary_slip.py similarity index 94% rename from erpnext/hr/doctype/salary_slip/test_salary_slip.py rename to erpnext/payroll/doctype/salary_slip/test_salary_slip.py index 3eff738ec8d..f42b9ad11dc 100644 --- a/erpnext/hr/doctype/salary_slip/test_salary_slip.py +++ b/erpnext/payroll/doctype/salary_slip/test_salary_slip.py @@ -10,17 +10,17 @@ import random from erpnext.accounts.utils import get_fiscal_year from frappe.utils.make_random import get_random from frappe.utils import getdate, nowdate, add_days, add_months, flt, get_first_day, get_last_day -from erpnext.hr.doctype.salary_structure.salary_structure import make_salary_slip -from erpnext.hr.doctype.payroll_entry.payroll_entry import get_month_details +from erpnext.payroll.doctype.salary_structure.salary_structure import make_salary_slip +from erpnext.payroll.doctype.payroll_entry.payroll_entry import get_month_details from erpnext.hr.doctype.employee.test_employee import make_employee -from erpnext.hr.doctype.employee_tax_exemption_declaration.test_employee_tax_exemption_declaration \ +from erpnext.payroll.doctype.employee_tax_exemption_declaration.test_employee_tax_exemption_declaration \ import create_payroll_period, create_exemption_category class TestSalarySlip(unittest.TestCase): def setUp(self): setup_test() def tearDown(self): - frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0) + frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 0) frappe.set_user("Administrator") def test_payment_days_based_on_attendance(self): @@ -28,8 +28,8 @@ class TestSalarySlip(unittest.TestCase): no_of_days = self.get_no_of_days() # Payroll based on attendance - frappe.db.set_value("HR Settings", None, "payroll_based_on", "Attendance") - frappe.db.set_value("HR Settings", None, "daily_wages_fraction_for_half_day", 0.75) + frappe.db.set_value("Payroll Settings", None, "payroll_based_on", "Attendance") + frappe.db.set_value("Payroll Settings", None, "daily_wages_fraction_for_half_day", 0.75) emp_id = make_employee("test_for_attendance@salary.com") frappe.db.set_value("Employee", emp_id, {"relieving_date": None, "status": "Active"}) @@ -47,7 +47,7 @@ class TestSalarySlip(unittest.TestCase): """, (month_start_date, month_end_date))[0][0] mark_attendance(emp_id, first_sunday, 'Absent', ignore_validate=True) # invalid lwp - mark_attendance(emp_id, add_days(first_sunday, 1), 'Absent', ignore_validate=True) # valid lwp + mark_attendance(emp_id, add_days(first_sunday, 1), 'Absent', ignore_validate=True) # counted as absent mark_attendance(emp_id, add_days(first_sunday, 2), 'Half Day', leave_type='Leave Without Pay', ignore_validate=True) # valid 0.75 lwp mark_attendance(emp_id, add_days(first_sunday, 3), 'On Leave', leave_type='Leave Without Pay', ignore_validate=True) # valid lwp mark_attendance(emp_id, add_days(first_sunday, 4), 'On Leave', leave_type='Casual Leave', ignore_validate=True) # invalid lwp @@ -55,7 +55,8 @@ class TestSalarySlip(unittest.TestCase): ss = make_employee_salary_slip("test_for_attendance@salary.com", "Monthly") - self.assertEqual(ss.leave_without_pay, 2.25) + self.assertEqual(ss.leave_without_pay, 1.25) + self.assertEqual(ss.absent_days, 1) days_in_month = no_of_days[0] no_of_holidays = no_of_days[1] @@ -63,17 +64,17 @@ class TestSalarySlip(unittest.TestCase): self.assertEqual(ss.payment_days, days_in_month - no_of_holidays - 2.25) #Gross pay calculation based on attendances - gross_pay = 78000 - ((78000 / (days_in_month - no_of_holidays)) * flt(ss.leave_without_pay)) + gross_pay = 78000 - ((78000 / (days_in_month - no_of_holidays)) * flt(ss.leave_without_pay + ss.absent_days)) self.assertEqual(ss.gross_pay, gross_pay) - frappe.db.set_value("HR Settings", None, "payroll_based_on", "Leave") + frappe.db.set_value("Payroll Settings", None, "payroll_based_on", "Leave") def test_payment_days_based_on_leave_application(self): no_of_days = self.get_no_of_days() # Payroll based on attendance - frappe.db.set_value("HR Settings", None, "payroll_based_on", "Leave") + frappe.db.set_value("Payroll Settings", None, "payroll_based_on", "Leave") emp_id = make_employee("test_for_attendance@salary.com") frappe.db.set_value("Employee", emp_id, {"relieving_date": None, "status": "Active"}) @@ -106,11 +107,11 @@ class TestSalarySlip(unittest.TestCase): self.assertEqual(ss.gross_pay, gross_pay) - frappe.db.set_value("HR Settings", None, "payroll_based_on", "Leave") + frappe.db.set_value("Payroll Settings", None, "payroll_based_on", "Leave") def test_salary_slip_with_holidays_included(self): no_of_days = self.get_no_of_days() - frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 1) + frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 1) make_employee("test_employee@salary.com") frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None) @@ -126,7 +127,7 @@ class TestSalarySlip(unittest.TestCase): def test_salary_slip_with_holidays_excluded(self): no_of_days = self.get_no_of_days() - frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0) + frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 0) make_employee("test_employee@salary.com") frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None) @@ -144,7 +145,7 @@ class TestSalarySlip(unittest.TestCase): def test_payment_days(self): no_of_days = self.get_no_of_days() # Holidays not included in working days - frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 1) + frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 1) # set joinng date in the same month make_employee("test_employee@salary.com") @@ -200,7 +201,7 @@ class TestSalarySlip(unittest.TestCase): def test_email_salary_slip(self): frappe.db.sql("delete from `tabEmail Queue`") - frappe.db.set_value("HR Settings", None, "email_salary_slip_to_employee", 1) + frappe.db.set_value("Payroll Settings", None, "email_salary_slip_to_employee", 1) make_employee("test_employee@salary.com") ss = make_employee_salary_slip("test_employee@salary.com", "Monthly") @@ -270,7 +271,7 @@ class TestSalarySlip(unittest.TestCase): # as per assigned salary structure 40500 in monthly salary so 236000*5/100/12 frappe.db.sql("""delete from `tabPayroll Period`""") frappe.db.sql("""delete from `tabSalary Component`""") - + payroll_period = create_payroll_period() create_tax_slab(payroll_period, allow_tax_exemption=True) @@ -287,7 +288,7 @@ class TestSalarySlip(unittest.TestCase): for doc in delete_docs: frappe.db.sql("delete from `tab%s` where employee='%s'" % (doc, employee)) - from erpnext.hr.doctype.salary_structure.test_salary_structure import \ + from erpnext.payroll.doctype.salary_structure.test_salary_structure import \ make_salary_structure, create_salary_structure_assignment salary_structure = make_salary_structure("Stucture to test tax", "Monthly", other_details={"max_benefits": 100000}, test_tax=True) @@ -378,7 +379,7 @@ class TestSalarySlip(unittest.TestCase): return [no_of_days_in_month[1], no_of_holidays_in_month] def make_employee_salary_slip(user, payroll_frequency, salary_structure=None): - from erpnext.hr.doctype.salary_structure.test_salary_structure import make_salary_structure + from erpnext.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure if not salary_structure: salary_structure = payroll_frequency + " Salary Structure Test for Salary Slip" @@ -699,7 +700,7 @@ def setup_test(): make_holiday_list() frappe.db.set_value("Company", erpnext.get_default_company(), "default_holiday_list", "Salary Slip Test Holiday List") - frappe.db.set_value("HR Settings", None, "email_salary_slip_to_employee", 0) + frappe.db.set_value("Payroll Settings", None, "email_salary_slip_to_employee", 0) frappe.db.set_value('HR Settings', None, 'leave_status_notification_template', None) frappe.db.set_value('HR Settings', None, 'leave_approval_notification_template', None) diff --git a/erpnext/hr/notification/retention_bonus/__init__.py b/erpnext/payroll/doctype/salary_slip_timesheet/__init__.py similarity index 100% rename from erpnext/hr/notification/retention_bonus/__init__.py rename to erpnext/payroll/doctype/salary_slip_timesheet/__init__.py diff --git a/erpnext/payroll/doctype/salary_slip_timesheet/salary_slip_timesheet.json b/erpnext/payroll/doctype/salary_slip_timesheet/salary_slip_timesheet.json new file mode 100644 index 00000000000..028c195a2fe --- /dev/null +++ b/erpnext/payroll/doctype/salary_slip_timesheet/salary_slip_timesheet.json @@ -0,0 +1,40 @@ +{ + "actions": [], + "creation": "2016-06-14 19:22:29.811658", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "time_sheet", + "working_hours" + ], + "fields": [ + { + "fieldname": "time_sheet", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Time Sheet", + "options": "Timesheet", + "reqd": 1 + }, + { + "fieldname": "working_hours", + "fieldtype": "Float", + "in_list_view": 1, + "label": "Working Hours", + "no_copy": 1, + "read_only": 1 + } + ], + "istable": 1, + "links": [], + "modified": "2020-05-27 23:27:43.463532", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Salary Slip Timesheet", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC" +} \ No newline at end of file diff --git a/erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.py b/erpnext/payroll/doctype/salary_slip_timesheet/salary_slip_timesheet.py similarity index 72% rename from erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.py rename to erpnext/payroll/doctype/salary_slip_timesheet/salary_slip_timesheet.py index 1bbfc53a32d..7adb12e83a4 100644 --- a/erpnext/hr/doctype/salary_slip_timesheet/salary_slip_timesheet.py +++ b/erpnext/payroll/doctype/salary_slip_timesheet/salary_slip_timesheet.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt from __future__ import unicode_literals -import frappe +# import frappe from frappe.model.document import Document class SalarySlipTimesheet(Document): diff --git a/erpnext/hr/doctype/salary_structure/README.md b/erpnext/payroll/doctype/salary_structure/README.md similarity index 100% rename from erpnext/hr/doctype/salary_structure/README.md rename to erpnext/payroll/doctype/salary_structure/README.md diff --git a/erpnext/hr/doctype/salary_structure/__init__.py b/erpnext/payroll/doctype/salary_structure/__init__.py similarity index 100% rename from erpnext/hr/doctype/salary_structure/__init__.py rename to erpnext/payroll/doctype/salary_structure/__init__.py diff --git a/erpnext/payroll/doctype/salary_structure/condition_and_formula_help.html b/erpnext/payroll/doctype/salary_structure/condition_and_formula_help.html new file mode 100644 index 00000000000..e59d78d1b8b --- /dev/null +++ b/erpnext/payroll/doctype/salary_structure/condition_and_formula_help.html @@ -0,0 +1,47 @@ +

Variables

+
    +
  • + Variables from Salary Structure Assignment:
    + base = Base, variable = Variable etc. +
  • +
  • + Variables from Employee:
    Employment Type = employment_type, Branch = branch etc. +
  • +
  • + Variables Salary Slip:
    + Payment Days = payment_days, Leave without pay = leave_without_pay etc. +
  • +
  • + Abbreviation from Salary Component:
    + BS = Basic Salary etc. +
  • +
  • + Some additional variable:
    + gross_pay and annual_taxable_earning can also be used. +
  • +
  • Direct Amount can also be used
  • +
+ +

Examples for Conditions and formula

+
    +
  • + Calculating Basic Salary based on base +
    Condition: base < 10000
    +
    Formula: base * .2
    +
  • +
  • + Calculating HRA based on Basic SalaryBS +
    Condition: BS > 2000
    +
    Formula: BS * .1
    +
  • +
  • + Calculating TDS based on Employment Typeemployment_type +
    Condition: employment_type=="Intern"
    +
    Amount: 1000
    +
  • +
  • + Calculating Income Tax based on annual_taxable_earning +
    Condition: annual_taxable_earning > 20000000
    +
    Formula: annual_taxable_earning * 0.10 
    +
  • +
\ No newline at end of file diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.js b/erpnext/payroll/doctype/salary_structure/salary_structure.js similarity index 91% rename from erpnext/hr/doctype/salary_structure/salary_structure.js rename to erpnext/payroll/doctype/salary_structure/salary_structure.js index 7748403513f..ca458f976f6 100755 --- a/erpnext/hr/doctype/salary_structure/salary_structure.js +++ b/erpnext/payroll/doctype/salary_structure/salary_structure.js @@ -14,7 +14,30 @@ cur_frm.cscript.onload = function(doc, dt, dn){ frappe.ui.form.on('Salary Structure', { onload: function(frm) { - frm.toggle_reqd(['payroll_frequency'], !frm.doc.salary_slip_based_on_timesheet), + + let help_button = $(` + Condition and Formula Help + `).click(()=>{ + + let d = new frappe.ui.Dialog({ + title: 'Condition and Formula Help', + fields: [ + { + fieldname: 'msg_wrapper', + fieldtype: 'HTML' + } + ] + }); + + let message_html = frappe.render_template("condition_and_formula_help") + + d.fields_dict.msg_wrapper.$wrapper.append(message_html) + + d.show() + }); + frm.get_field("conditions_and_formula_variable_and_example").$wrapper.append(frm.doc.filters_html).append(help_button) + + frm.toggle_reqd(['payroll_frequency'], !frm.doc.salary_slip_based_on_timesheet) frm.set_query("salary_component", "earnings", function() { return { @@ -114,7 +137,7 @@ frappe.ui.form.on('Salary Structure', { preview_salary_slip: function(frm) { frappe.call({ - method: "erpnext.hr.doctype.salary_structure.salary_structure.get_employees", + method: "erpnext.payroll.doctype.salary_structure.salary_structure.get_employees", args: { salary_structure: frm.doc.name }, @@ -155,7 +178,7 @@ frappe.ui.form.on('Salary Structure', { open_salary_slip: function(frm, employee){ var print_format = frm.doc.salary_slip_based_on_timesheet ? "Salary Slip based on Timesheet" : "Salary Slip Standard"; frappe.call({ - method: "erpnext.hr.doctype.salary_structure.salary_structure.make_salary_slip", + method: "erpnext.payroll.doctype.salary_structure.salary_structure.make_salary_slip", args: { source_name: frm.doc.name, employee: employee, diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.json b/erpnext/payroll/doctype/salary_structure/salary_structure.json similarity index 71% rename from erpnext/hr/doctype/salary_structure/salary_structure.json rename to erpnext/payroll/doctype/salary_structure/salary_structure.json index 58c4044093e..e710f6b72cb 100644 --- a/erpnext/hr/doctype/salary_structure/salary_structure.json +++ b/erpnext/payroll/doctype/salary_structure/salary_structure.json @@ -22,10 +22,9 @@ "leave_encashment_amount_per_day", "max_benefits", "earning_deduction", - "earning", "earnings", - "deduction", "deductions", + "conditions_and_formula_variable_and_example", "net_pay_detail", "column_break2", "total_earning", @@ -44,17 +43,23 @@ "label": "Company", "options": "Company", "remember_last_selected_value": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "letter_head", "fieldtype": "Link", "label": "Letter Head", - "options": "Letter Head" + "options": "Letter Head", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break1", "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1, "width": "50%" }, { @@ -67,7 +72,9 @@ "oldfieldname": "is_active", "oldfieldtype": "Select", "options": "\nYes\nNo", - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": "Monthly", @@ -75,7 +82,9 @@ "fieldname": "payroll_frequency", "fieldtype": "Select", "label": "Payroll Frequency", - "options": "\nMonthly\nFortnightly\nBimonthly\nWeekly\nDaily" + "options": "\nMonthly\nFortnightly\nBimonthly\nWeekly\nDaily", + "show_days": 1, + "show_seconds": 1 }, { "default": "No", @@ -86,46 +95,62 @@ "no_copy": 1, "options": "Yes\nNo", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "time_sheet_earning_detail", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "salary_slip_based_on_timesheet", "fieldtype": "Check", - "label": "Salary Slip Based on Timesheet" + "label": "Salary Slip Based on Timesheet", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_17", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "description": "Salary Component for timesheet based payroll.", "fieldname": "salary_component", "fieldtype": "Link", "label": "Salary Component", - "options": "Salary Component" + "options": "Salary Component", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "hour_rate", "fieldtype": "Currency", "label": "Hour Rate", - "options": "Company:company:default_currency" + "options": "Company:company:default_currency", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "leave_encashment_amount_per_day", "fieldtype": "Currency", "label": "Leave Encashment Amount Per Day", - "options": "Company:company:default_currency" + "options": "Company:company:default_currency", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "max_benefits", "fieldtype": "Currency", "label": "Max Benefits (Amount)", - "options": "Company:company:default_currency" + "options": "Company:company:default_currency", + "show_days": 1, + "show_seconds": 1 }, { "description": "Salary breakup based on Earning and Deduction.", @@ -133,15 +158,9 @@ "fieldtype": "Section Break", "oldfieldname": "earning_deduction", "oldfieldtype": "Section Break", - "precision": "2" - }, - { - "fieldname": "earning", - "fieldtype": "Section Break", - "label": "Earning", - "oldfieldname": "col_brk2", - "oldfieldtype": "Column Break", - "width": "50%" + "precision": "2", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "earnings", @@ -149,15 +168,9 @@ "label": "Earnings", "oldfieldname": "earning_details", "oldfieldtype": "Table", - "options": "Salary Detail" - }, - { - "fieldname": "deduction", - "fieldtype": "Section Break", - "label": "Deduction", - "oldfieldname": "col_brk3", - "oldfieldtype": "Column Break", - "width": "50%" + "options": "Salary Detail", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "deductions", @@ -165,16 +178,22 @@ "label": "Deductions", "oldfieldname": "deduction_details", "oldfieldtype": "Table", - "options": "Salary Detail" + "options": "Salary Detail", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "net_pay_detail", "fieldtype": "Section Break", - "options": "Simple" + "options": "Simple", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break2", "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1, "width": "50%" }, { @@ -185,7 +204,9 @@ "oldfieldname": "total_earning", "oldfieldtype": "Currency", "options": "Company:company:default_currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total_deduction", @@ -195,7 +216,9 @@ "oldfieldname": "total_deduction", "oldfieldtype": "Currency", "options": "Company:company:default_currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "net_pay", @@ -203,28 +226,38 @@ "hidden": 1, "label": "Net Pay", "options": "Company:company:default_currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "account", "fieldtype": "Section Break", - "label": "Account" + "label": "Account", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "mode_of_payment", "fieldtype": "Link", "label": "Mode of Payment", - "options": "Mode of Payment" + "options": "Mode of Payment", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_28", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "payment_account", "fieldtype": "Link", "label": "Payment Account", - "options": "Account" + "options": "Account", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "amended_from", @@ -233,16 +266,25 @@ "no_copy": 1, "options": "Salary Structure", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "conditions_and_formula_variable_and_example", + "fieldtype": "HTML", + "label": "Conditions and Formula variable and example", + "show_days": 1, + "show_seconds": 1 } ], "icon": "fa fa-file-text", "idx": 1, "is_submittable": 1, "links": [], - "modified": "2019-12-31 16:34:35.087658", + "modified": "2020-06-05 17:07:26.129355", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Salary Structure", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.py b/erpnext/payroll/doctype/salary_structure/salary_structure.py similarity index 100% rename from erpnext/hr/doctype/salary_structure/salary_structure.py rename to erpnext/payroll/doctype/salary_structure/salary_structure.py diff --git a/erpnext/hr/doctype/salary_structure/salary_structure_dashboard.py b/erpnext/payroll/doctype/salary_structure/salary_structure_dashboard.py similarity index 100% rename from erpnext/hr/doctype/salary_structure/salary_structure_dashboard.py rename to erpnext/payroll/doctype/salary_structure/salary_structure_dashboard.py diff --git a/erpnext/hr/doctype/salary_structure/test_salary_structure.js b/erpnext/payroll/doctype/salary_structure/test_salary_structure.js similarity index 100% rename from erpnext/hr/doctype/salary_structure/test_salary_structure.js rename to erpnext/payroll/doctype/salary_structure/test_salary_structure.js diff --git a/erpnext/hr/doctype/salary_structure/test_salary_structure.py b/erpnext/payroll/doctype/salary_structure/test_salary_structure.py similarity index 94% rename from erpnext/hr/doctype/salary_structure/test_salary_structure.py rename to erpnext/payroll/doctype/salary_structure/test_salary_structure.py index eb5311e3b81..e04fda81202 100644 --- a/erpnext/hr/doctype/salary_structure/test_salary_structure.py +++ b/erpnext/payroll/doctype/salary_structure/test_salary_structure.py @@ -7,11 +7,11 @@ import unittest import erpnext from frappe.utils.make_random import get_random from frappe.utils import nowdate, add_days, add_years, getdate, add_months -from erpnext.hr.doctype.salary_structure.salary_structure import make_salary_slip -from erpnext.hr.doctype.salary_slip.test_salary_slip import make_earning_salary_component,\ +from erpnext.payroll.doctype.salary_structure.salary_structure import make_salary_slip +from erpnext.payroll.doctype.salary_slip.test_salary_slip import make_earning_salary_component,\ make_deduction_salary_component, make_employee_salary_slip, create_tax_slab from erpnext.hr.doctype.employee.test_employee import make_employee -from erpnext.hr.doctype.employee_tax_exemption_declaration.test_employee_tax_exemption_declaration import create_payroll_period +from erpnext.payroll.doctype.employee_tax_exemption_declaration.test_employee_tax_exemption_declaration import create_payroll_period test_dependencies = ["Fiscal Year"] @@ -62,7 +62,7 @@ class TestSalaryStructure(unittest.TestCase): self.assertEqual(assignment.base * 0.2, ss.deductions[0].amount) def test_amount_totals(self): - frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0) + frappe.db.set_value("Payroll Settings", None, "include_holidays_in_total_working_days", 0) sal_slip = frappe.get_value("Salary Slip", {"employee_name":"test_employee_2@salary.com"}) if not sal_slip: sal_slip = make_employee_salary_slip("test_employee_2@salary.com", "Monthly", "Salary Structure Sample") @@ -128,7 +128,7 @@ def make_salary_structure(salary_structure, payroll_frequency, employee=None, do salary_structure_doc.insert() if not dont_submit: salary_structure_doc.submit() - + else: salary_structure_doc = frappe.get_doc("Salary Structure", salary_structure) diff --git a/erpnext/hr/print_format/salary_slip_based_on_timesheet/__init__.py b/erpnext/payroll/doctype/salary_structure_assignment/__init__.py similarity index 100% rename from erpnext/hr/print_format/salary_slip_based_on_timesheet/__init__.py rename to erpnext/payroll/doctype/salary_structure_assignment/__init__.py diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js b/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.js similarity index 100% rename from erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.js rename to erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.js diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json b/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.json similarity index 98% rename from erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json rename to erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.json index 0098aa8ec80..4f74a7fecf4 100644 --- a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.json +++ b/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.json @@ -124,9 +124,9 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-04-25 18:24:23.617088", + "modified": "2020-05-27 19:58:09.964692", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Salary Structure Assignment", "owner": "Administrator", "permissions": [ diff --git a/erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py b/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.py similarity index 100% rename from erpnext/hr/doctype/salary_structure_assignment/salary_structure_assignment.py rename to erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.py diff --git a/erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.js b/erpnext/payroll/doctype/salary_structure_assignment/test_salary_structure_assignment.js similarity index 100% rename from erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.js rename to erpnext/payroll/doctype/salary_structure_assignment/test_salary_structure_assignment.js diff --git a/erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.py b/erpnext/payroll/doctype/salary_structure_assignment/test_salary_structure_assignment.py similarity index 100% rename from erpnext/hr/doctype/salary_structure_assignment/test_salary_structure_assignment.py rename to erpnext/payroll/doctype/salary_structure_assignment/test_salary_structure_assignment.py diff --git a/erpnext/hr/print_format/salary_slip_standard/__init__.py b/erpnext/payroll/doctype/taxable_salary_slab/__init__.py similarity index 100% rename from erpnext/hr/print_format/salary_slip_standard/__init__.py rename to erpnext/payroll/doctype/taxable_salary_slab/__init__.py diff --git a/erpnext/payroll/doctype/taxable_salary_slab/taxable_salary_slab.json b/erpnext/payroll/doctype/taxable_salary_slab/taxable_salary_slab.json new file mode 100644 index 00000000000..277576eff97 --- /dev/null +++ b/erpnext/payroll/doctype/taxable_salary_slab/taxable_salary_slab.json @@ -0,0 +1,64 @@ +{ + "actions": [], + "creation": "2018-04-13 17:42:13.516032", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "from_amount", + "to_amount", + "percent_deduction", + "condition", + "column_break_5", + "html_6" + ], + "fields": [ + { + "fieldname": "from_amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "From Amount", + "reqd": 1 + }, + { + "fieldname": "to_amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "To Amount" + }, + { + "fieldname": "percent_deduction", + "fieldtype": "Percent", + "in_list_view": 1, + "label": "Percent Deduction", + "reqd": 1 + }, + { + "fieldname": "condition", + "fieldtype": "Code", + "in_list_view": 1, + "label": "Condition" + }, + { + "fieldname": "column_break_5", + "fieldtype": "Column Break" + }, + { + "fieldname": "html_6", + "fieldtype": "HTML", + "options": "

Condition Examples

\n
    \n
  1. Applying tax if employee born between 31-12-1937 and 01-01-1958 (Employees aged 60 to 80)
    \nCondition: date_of_birth>date(1937, 12, 31) and date_of_birth<date(1958, 01, 01)

  2. Applying tax by employee gender
    \nCondition: gender==\"Male\"

  3. \n
  4. Applying tax by Salary Component
    \nCondition: base > 10000
" + } + ], + "istable": 1, + "links": [], + "modified": "2020-05-27 23:32:47.253106", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Taxable Salary Slab", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.py b/erpnext/payroll/doctype/taxable_salary_slab/taxable_salary_slab.py similarity index 71% rename from erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.py rename to erpnext/payroll/doctype/taxable_salary_slab/taxable_salary_slab.py index 23e5ffbe629..49c52557dbc 100644 --- a/erpnext/hr/doctype/taxable_salary_slab/taxable_salary_slab.py +++ b/erpnext/payroll/doctype/taxable_salary_slab/taxable_salary_slab.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt from __future__ import unicode_literals -import frappe +# import frappe from frappe.model.document import Document class TaxableSalarySlab(Document): diff --git a/erpnext/payroll/module_onboarding/payroll/payroll.json b/erpnext/payroll/module_onboarding/payroll/payroll.json new file mode 100644 index 00000000000..a4ea53640eb --- /dev/null +++ b/erpnext/payroll/module_onboarding/payroll/payroll.json @@ -0,0 +1,51 @@ +{ + "allow_roles": [ + { + "role": "HR Manager" + }, + { + "role": "HR User" + } + ], + "creation": "2020-06-01 12:10:52.560472", + "docstatus": 0, + "doctype": "Module Onboarding", + "documentation_url": "https://docs.erpnext.com/docs/user/manual/en/human-resources/payroll-entry", + "idx": 0, + "is_complete": 0, + "modified": "2020-06-04 16:35:30.650792", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Payroll", + "owner": "Administrator", + "steps": [ + { + "step": "Create Employee" + }, + { + "step": "Create Salary Component" + }, + { + "step": "Create Payroll Period" + }, + { + "step": "Create Income Tax Slab" + }, + { + "step": "Create Salary Structure" + }, + { + "step": "Assign Salary Structure" + }, + { + "step": "Create Salary Slip" + }, + { + "step": "Payroll Settings" + } + ], + "subtitle": "Salary, Compensations and more.", + "success_message": "The Payroll is all set up!", + "title": "Let's Setup the Payroll Module. ", + "user_can_dismiss": 1 +} \ No newline at end of file diff --git a/erpnext/payroll/notification/as b/erpnext/payroll/notification/as new file mode 100644 index 00000000000..7a395572613 --- /dev/null +++ b/erpnext/payroll/notification/as @@ -0,0 +1 @@ +update from `tabNotification` set module='Payroll' where name = "Retention Bonus" \ No newline at end of file diff --git a/erpnext/hr/report/bank_remittance/__init__.py b/erpnext/payroll/notification/retention_bonus/__init__.py similarity index 100% rename from erpnext/hr/report/bank_remittance/__init__.py rename to erpnext/payroll/notification/retention_bonus/__init__.py diff --git a/erpnext/hr/notification/retention_bonus/retention_bonus.json b/erpnext/payroll/notification/retention_bonus/retention_bonus.json similarity index 86% rename from erpnext/hr/notification/retention_bonus/retention_bonus.json rename to erpnext/payroll/notification/retention_bonus/retention_bonus.json index cbc8e2d0781..50db0338c4a 100644 --- a/erpnext/hr/notification/retention_bonus/retention_bonus.json +++ b/erpnext/payroll/notification/retention_bonus/retention_bonus.json @@ -13,10 +13,10 @@ "is_standard": 1, "message": "

{{ _(\"Hello\") }},

\n\n

{{ _(\"Retention Bonus for\") }} {{ doc.employee_name }} {{ _(\"due on\") }} {{ doc.bonus_payment_date }}

", "modified": "2018-05-15 19:00:24.294418", - "modified_by": "ranjith@earthianslive.com", - "module": "HR", + "modified_by": "Administrator", + "module": "Payroll", "name": "Retention Bonus", - "owner": "ranjith@earthianslive.com", + "owner": "Administrator", "recipients": [ { "email_by_role": "HR Manager" diff --git a/erpnext/hr/notification/retention_bonus/retention_bonus.md b/erpnext/payroll/notification/retention_bonus/retention_bonus.md similarity index 100% rename from erpnext/hr/notification/retention_bonus/retention_bonus.md rename to erpnext/payroll/notification/retention_bonus/retention_bonus.md diff --git a/erpnext/hr/notification/retention_bonus/retention_bonus.py b/erpnext/payroll/notification/retention_bonus/retention_bonus.py similarity index 100% rename from erpnext/hr/notification/retention_bonus/retention_bonus.py rename to erpnext/payroll/notification/retention_bonus/retention_bonus.py diff --git a/erpnext/payroll/onboarding_step/assign_salary_structure/assign_salary_structure.json b/erpnext/payroll/onboarding_step/assign_salary_structure/assign_salary_structure.json new file mode 100644 index 00000000000..8a07b10276a --- /dev/null +++ b/erpnext/payroll/onboarding_step/assign_salary_structure/assign_salary_structure.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-06-01 11:58:43.927590", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 1, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-06-01 11:58:43.927590", + "modified_by": "Administrator", + "name": "Assign Salary Structure", + "owner": "Administrator", + "reference_document": "Salary Structure Assignment", + "show_full_form": 1, + "title": "Assign Salary Structure", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/payroll/onboarding_step/create_employee/create_employee.json b/erpnext/payroll/onboarding_step/create_employee/create_employee.json new file mode 100644 index 00000000000..5839ae6ca4a --- /dev/null +++ b/erpnext/payroll/onboarding_step/create_employee/create_employee.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-05-14 11:43:25.561152", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 1, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-05-14 12:26:28.629074", + "modified_by": "Administrator", + "name": "Create Employee", + "owner": "Administrator", + "reference_document": "Employee", + "show_full_form": 0, + "title": "Create Employee", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/payroll/onboarding_step/create_income_tax_slab/create_income_tax_slab.json b/erpnext/payroll/onboarding_step/create_income_tax_slab/create_income_tax_slab.json new file mode 100644 index 00000000000..faada7e4119 --- /dev/null +++ b/erpnext/payroll/onboarding_step/create_income_tax_slab/create_income_tax_slab.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-06-01 11:54:54.823796", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-06-01 11:54:54.823796", + "modified_by": "Administrator", + "name": "Create Income Tax Slab", + "owner": "Administrator", + "reference_document": "Income Tax Slab", + "show_full_form": 1, + "title": "Create Income Tax Slab", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/payroll/onboarding_step/create_payroll_period/create_payroll_period.json b/erpnext/payroll/onboarding_step/create_payroll_period/create_payroll_period.json new file mode 100644 index 00000000000..4bae67546c7 --- /dev/null +++ b/erpnext/payroll/onboarding_step/create_payroll_period/create_payroll_period.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-06-01 11:53:54.553947", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 1, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-06-01 11:53:54.553947", + "modified_by": "Administrator", + "name": "Create Payroll Period", + "owner": "Administrator", + "reference_document": "Payroll Period", + "show_full_form": 0, + "title": "Create Payroll Period", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/payroll/onboarding_step/create_salary_component/create_salary_component.json b/erpnext/payroll/onboarding_step/create_salary_component/create_salary_component.json new file mode 100644 index 00000000000..002d819618e --- /dev/null +++ b/erpnext/payroll/onboarding_step/create_salary_component/create_salary_component.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-06-01 11:57:04.002073", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-06-01 11:57:04.002073", + "modified_by": "Administrator", + "name": "Create Salary Component", + "owner": "Administrator", + "reference_document": "Salary Component", + "show_full_form": 1, + "title": "Create Salary Component", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/payroll/onboarding_step/create_salary_slip/create_salary_slip.json b/erpnext/payroll/onboarding_step/create_salary_slip/create_salary_slip.json new file mode 100644 index 00000000000..2aa31f485f3 --- /dev/null +++ b/erpnext/payroll/onboarding_step/create_salary_slip/create_salary_slip.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-06-01 11:59:29.972393", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 1, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-06-01 11:59:29.972393", + "modified_by": "Administrator", + "name": "Create Salary Slip", + "owner": "Administrator", + "reference_document": "Salary Slip", + "show_full_form": 1, + "title": "Create Salary Slip", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/payroll/onboarding_step/create_salary_structure/create_salary_structure.json b/erpnext/payroll/onboarding_step/create_salary_structure/create_salary_structure.json new file mode 100644 index 00000000000..11d8327259a --- /dev/null +++ b/erpnext/payroll/onboarding_step/create_salary_structure/create_salary_structure.json @@ -0,0 +1,19 @@ +{ + "action": "Create Entry", + "creation": "2020-06-01 11:57:54.527808", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 1, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-06-01 11:57:54.527808", + "modified_by": "Administrator", + "name": "Create Salary Structure", + "owner": "Administrator", + "reference_document": "Salary Structure", + "show_full_form": 1, + "title": "Create Salary Structure", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/payroll/onboarding_step/payroll_settings/payroll_settings.json b/erpnext/payroll/onboarding_step/payroll_settings/payroll_settings.json new file mode 100644 index 00000000000..946b8c8707a --- /dev/null +++ b/erpnext/payroll/onboarding_step/payroll_settings/payroll_settings.json @@ -0,0 +1,19 @@ +{ + "action": "Go to Page", + "creation": "2020-06-04 16:34:29.664917", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_mandatory": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2020-06-04 16:34:29.664917", + "modified_by": "Administrator", + "name": "Payroll Settings", + "owner": "Administrator", + "path": "#Form/Payroll Settings", + "show_full_form": 0, + "title": "Payroll Settings", + "validate_action": 1 +} \ No newline at end of file diff --git a/erpnext/hr/report/salary_register/__init__.py b/erpnext/payroll/print_format/salary_slip_based_on_timesheet/__init__.py similarity index 100% rename from erpnext/hr/report/salary_register/__init__.py rename to erpnext/payroll/print_format/salary_slip_based_on_timesheet/__init__.py diff --git a/erpnext/hr/print_format/salary_slip_based_on_timesheet/salary_slip_based_on_timesheet.json b/erpnext/payroll/print_format/salary_slip_based_on_timesheet/salary_slip_based_on_timesheet.json similarity index 100% rename from erpnext/hr/print_format/salary_slip_based_on_timesheet/salary_slip_based_on_timesheet.json rename to erpnext/payroll/print_format/salary_slip_based_on_timesheet/salary_slip_based_on_timesheet.json diff --git a/erpnext/payroll/print_format/salary_slip_standard/__init__.py b/erpnext/payroll/print_format/salary_slip_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/hr/print_format/salary_slip_standard/salary_slip_standard.json b/erpnext/payroll/print_format/salary_slip_standard/salary_slip_standard.json similarity index 100% rename from erpnext/hr/print_format/salary_slip_standard/salary_slip_standard.json rename to erpnext/payroll/print_format/salary_slip_standard/salary_slip_standard.json diff --git a/erpnext/payroll/report/__init__.py b/erpnext/payroll/report/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/payroll/report/bank_remittance/__init__.py b/erpnext/payroll/report/bank_remittance/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/hr/report/bank_remittance/bank_remittance.js b/erpnext/payroll/report/bank_remittance/bank_remittance.js similarity index 68% rename from erpnext/hr/report/bank_remittance/bank_remittance.js rename to erpnext/payroll/report/bank_remittance/bank_remittance.js index 1e10f24301e..6482ed34516 100644 --- a/erpnext/hr/report/bank_remittance/bank_remittance.js +++ b/erpnext/payroll/report/bank_remittance/bank_remittance.js @@ -5,12 +5,12 @@ frappe.query_reports["Bank Remittance"] = { "filters": [ { - "fieldname":"company", - "label": __("Company"), - "fieldtype": "Link", - "options": "Company", - "default": frappe.defaults.get_user_default("Company"), - "reqd": 1 + fieldname:"company", + label: __("Company"), + fieldtype: "Link", + options: "Company", + default: frappe.defaults.get_user_default("Company"), + reqd: 1 }, { fieldname:"from_date", diff --git a/erpnext/hr/report/bank_remittance/bank_remittance.json b/erpnext/payroll/report/bank_remittance/bank_remittance.json similarity index 87% rename from erpnext/hr/report/bank_remittance/bank_remittance.json rename to erpnext/payroll/report/bank_remittance/bank_remittance.json index b8aa4e98d27..2a697b25892 100644 --- a/erpnext/hr/report/bank_remittance/bank_remittance.json +++ b/erpnext/payroll/report/bank_remittance/bank_remittance.json @@ -7,9 +7,9 @@ "doctype": "Report", "idx": 0, "is_standard": "Yes", - "modified": "2019-04-26 16:57:52.558895", + "modified": "2020-05-28 00:08:08.097494", "modified_by": "Administrator", - "module": "HR", + "module": "Payroll", "name": "Bank Remittance", "owner": "Administrator", "prepared_report": 0, diff --git a/erpnext/hr/report/bank_remittance/bank_remittance.py b/erpnext/payroll/report/bank_remittance/bank_remittance.py similarity index 96% rename from erpnext/hr/report/bank_remittance/bank_remittance.py rename to erpnext/payroll/report/bank_remittance/bank_remittance.py index b2d2c530247..a35d8e550ec 100644 --- a/erpnext/hr/report/bank_remittance/bank_remittance.py +++ b/erpnext/payroll/report/bank_remittance/bank_remittance.py @@ -125,7 +125,10 @@ def get_salary_slips(payroll_entries): # appending company debit accounts for slip in salary_slips: - slip["debit_acc_no"] = payroll_entry_map[slip.payroll_entry]['company_account'] + if slip.payroll_entry: + slip["debit_acc_no"] = payroll_entry_map[slip.payroll_entry]['company_account'] + else: + slip["debit_acc_no"] = None return salary_slips diff --git a/erpnext/payroll/report/income_tax_deductions/__init__.py b/erpnext/payroll/report/income_tax_deductions/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.js b/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.js new file mode 100644 index 00000000000..4bbb7f6a1be --- /dev/null +++ b/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.js @@ -0,0 +1,7 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.require("assets/erpnext/js/salary_slip_deductions_report_filters.js", function() { + frappe.query_reports["Income Tax Deductions"] = erpnext.salary_slip_deductions_report_filters; +}); \ No newline at end of file diff --git a/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.json b/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.json new file mode 100644 index 00000000000..cf80398f984 --- /dev/null +++ b/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.json @@ -0,0 +1,30 @@ +{ + "add_total_row": 0, + "creation": "2020-05-30 00:07:56.744372", + "disable_prepared_report": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "modified": "2020-05-30 00:07:56.744372", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Income Tax Deductions", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Salary Slip", + "report_name": "Income Tax Deductions", + "report_type": "Script Report", + "roles": [ + { + "role": "HR User" + }, + { + "role": "HR Manager" + }, + { + "role": "Employee" + } + ] +} \ No newline at end of file diff --git a/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.py b/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.py new file mode 100644 index 00000000000..3bad5879bb3 --- /dev/null +++ b/erpnext/payroll/report/income_tax_deductions/income_tax_deductions.py @@ -0,0 +1,127 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe, erpnext +from frappe import _ + +def execute(filters=None): + columns = get_columns(filters) + data = get_data(filters) + + return columns, data + +def get_columns(filters): + columns = [ + { + "label": _("Employee"), + "options": "Employee", + "fieldname": "employee", + "fieldtype": "Link", + "width": 200 + }, + { + "label": _("Employee Name"), + "options": "Employee", + "fieldname": "employee_name", + "fieldtype": "Link", + "width": 160 + }] + + if erpnext.get_region() == "India": + columns.append({ + "label": _("PAN Number"), + "fieldname": "pan_number", + "fieldtype": "Data", + "width": 140 + }) + + columns += [{ + "label": _("Income Tax Component"), + "fieldname": "it_comp", + "fieldtype": "Data", + "width": 170 + }, + { + "label": _("Income Tax Amount"), + "fieldname": "it_amount", + "fieldtype": "Currency", + "options": "currency", + "width": 140 + }, + { + "label": _("Gross Pay"), + "fieldname": "gross_pay", + "fieldtype": "Currency", + "options": "currency", + "width": 140 + }, + { + "label": _("Posting Date"), + "fieldname": "posting_date", + "fieldtype": "Date", + "width": 140 + } + ] + + return columns + +def get_conditions(filters): + conditions = [""] + + if filters.get("department"): + conditions.append("sal.department = '%s' " % (filters["department"]) ) + + if filters.get("branch"): + conditions.append("sal.branch = '%s' " % (filters["branch"]) ) + + if filters.get("company"): + conditions.append("sal.company = '%s' " % (filters["company"]) ) + + if filters.get("period"): + conditions.append("month(sal.start_date) = '%s' " % (filters["period"])) + + return " and ".join(conditions) + + +def get_data(filters): + + data = [] + + if erpnext.get_region() == "India": + employee_pan_dict = frappe._dict(frappe.db.sql(""" select employee, pan_number from `tabEmployee`""")) + + component_types = frappe.db.sql(""" select name from `tabSalary Component` + where is_income_tax_component = 1 """) + + component_types = [comp_type[0] for comp_type in component_types] + + conditions = get_conditions(filters) + + entry = frappe.db.sql(""" select sal.employee, sal.employee_name, sal.posting_date, ded.salary_component, ded.amount,sal.gross_pay + from `tabSalary Slip` sal, `tabSalary Detail` ded + where sal.name = ded.parent + and ded.parentfield = 'deductions' + and ded.parenttype = 'Salary Slip' + and sal.docstatus = 1 %s + and ded.salary_component in (%s) + """ % (conditions , ", ".join(['%s']*len(component_types))), tuple(component_types), as_dict=1) + + for d in entry: + + employee = { + "employee": d.employee, + "employee_name": d.employee_name, + "it_comp": d.salary_component, + "posting_date": d.posting_date, + # "pan_number": employee_pan_dict.get(d.employee), + "it_amount": d.amount, + "gross_pay": d.gross_pay + } + + if erpnext.get_region() == "India": + employee["pan_number"] = employee_pan_dict.get(d.employee) + + data.append(employee) + + return data diff --git a/erpnext/payroll/report/salary_payments_based_on_payment_mode/__init__.py b/erpnext/payroll/report/salary_payments_based_on_payment_mode/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.js b/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.js new file mode 100644 index 00000000000..166d982c9c6 --- /dev/null +++ b/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.js @@ -0,0 +1,7 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.require("assets/erpnext/js/salary_slip_deductions_report_filters.js", function() { + frappe.query_reports["Salary Payments Based On Payment Mode"] = erpnext.salary_slip_deductions_report_filters; +}); \ No newline at end of file diff --git a/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.json b/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.json new file mode 100644 index 00000000000..c04cc32b9b0 --- /dev/null +++ b/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.json @@ -0,0 +1,30 @@ +{ + "add_total_row": 0, + "creation": "2020-06-16 18:43:43.107246", + "disable_prepared_report": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "modified": "2020-06-16 18:43:43.107246", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Salary Payments Based On Payment Mode", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Salary Slip", + "report_name": "Salary Payments Based On Payment Mode", + "report_type": "Script Report", + "roles": [ + { + "role": "HR User" + }, + { + "role": "HR Manager" + }, + { + "role": "Employee" + } + ] +} \ No newline at end of file diff --git a/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.py b/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.py new file mode 100644 index 00000000000..7f0c2e2e000 --- /dev/null +++ b/erpnext/payroll/report/salary_payments_based_on_payment_mode/salary_payments_based_on_payment_mode.py @@ -0,0 +1,177 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe, erpnext +from frappe import _ +from erpnext.regional.report.provident_fund_deductions.provident_fund_deductions import get_conditions + +def execute(filters=None): + mode_of_payments = get_payment_modes() + + if not len(mode_of_payments): + return [], [] + + columns = get_columns(filters, mode_of_payments) + data, total_rows, report_summary = get_data(filters, mode_of_payments) + chart = get_chart(mode_of_payments, total_rows) + + return columns, data, None, chart, report_summary + +def get_columns(filters, mode_of_payments): + columns = [{ + "label": _("Branch"), + "options": "Branch", + "fieldname": "branch", + "fieldtype": "Link", + "width": 200 + }] + + for mode in mode_of_payments: + columns.append({ + "label": _(mode), + "fieldname": mode, + "fieldtype": "Currency", + "width": 160 + }) + + columns.append({ + "label": _("Total"), + "fieldname": "total", + "fieldtype": "Currency", + "width": 140 + }) + + return columns + +def get_payment_modes(): + mode_of_payments = frappe.db.sql_list(""" + select distinct mode_of_payment from `tabSalary Slip` where docstatus = 1 + """) + return mode_of_payments + +def prepare_data(entry): + branch_wise_entries = {} + gross_pay = 0 + + for d in entry: + gross_pay += d.gross_pay + if branch_wise_entries.get(d.branch): + branch_wise_entries[d.branch][d.mode_of_payment] = d.net_pay + else: + branch_wise_entries.setdefault(d.branch, {}).setdefault(d.mode_of_payment, d.net_pay) + + return branch_wise_entries, gross_pay + +def get_data(filters, mode_of_payments): + data = [] + + conditions = get_conditions(filters) + + entry = frappe.db.sql(""" + select branch, mode_of_payment, sum(net_pay) as net_pay, sum(gross_pay) as gross_pay + from `tabSalary Slip` sal + where docstatus = 1 %s + group by branch, mode_of_payment + """ % (conditions), as_dict=1) + + branch_wise_entries, gross_pay = prepare_data(entry) + + branches = frappe.db.sql_list(""" + select distinct branch from `tabSalary Slip` sal + where docstatus = 1 %s + """ % (conditions)) + + total_row = {"total": 0, "branch": "Total"} + + for branch in branches: + total = 0 + row = { + "branch": branch + } + for mode in mode_of_payments: + if branch_wise_entries.get(branch).get(mode): + row[mode] = branch_wise_entries.get(branch).get(mode) + total += branch_wise_entries.get(branch).get(mode) + + row["total"] = total + data.append(row) + + total_row = get_total_based_on_mode_of_payment(data, mode_of_payments) + total_deductions = gross_pay - total_row.get("total") + + if data: + data.append(total_row) + data.append({}) + data.append({ + "branch": "Total Gross Pay", + mode_of_payments[0]:gross_pay + }) + data.append({ + "branch": "Total Deductions", + mode_of_payments[0]:total_deductions + }) + data.append({ + "branch": "Total Net Pay", + mode_of_payments[0]:total_row.get("total") + }) + + currency = erpnext.get_company_currency(filters.company) + report_summary = get_report_summary(gross_pay, total_deductions, total_row.get("total"), currency) + + return data, total_row, report_summary + +def get_total_based_on_mode_of_payment(data, mode_of_payments): + + total = 0 + total_row = {"branch": "Total"} + for mode in mode_of_payments: + sum_of_payment = sum([detail[mode] for detail in data if mode in detail.keys()]) + total_row[mode] = sum_of_payment + total += sum_of_payment + + total_row["total"] = total + return total_row + +def get_report_summary(gross_pay, total_deductions, net_pay, currency): + return [ + { + "value": gross_pay, + "label": "Total Gross Pay", + "indicator": "Green", + "datatype": "Currency", + "currency": currency + }, + { + "value": total_deductions, + "label": "Total Deduction", + "datatype": "Currency", + "indicator": "Red", + "currency": currency + }, + { + "value": net_pay, + "label": "Total Net Pay", + "datatype": "Currency", + "indicator": "Blue", + "currency": currency + } + ] + +def get_chart(mode_of_payments, data): + if data: + values = [] + labels = [] + + for mode in mode_of_payments: + values.append(data[mode]) + labels.append([mode]) + + chart = { + "data": { + "labels": labels, + "datasets": [{'name': 'Mode Of Payments', "values": values}] + } + } + chart['type'] = "bar" + return chart diff --git a/erpnext/payroll/report/salary_payments_via_ecs/__init__.py b/erpnext/payroll/report/salary_payments_via_ecs/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.js b/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.js new file mode 100644 index 00000000000..e49fc112ff4 --- /dev/null +++ b/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.js @@ -0,0 +1,16 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.require("assets/erpnext/js/salary_slip_deductions_report_filters.js", function() { + + let ecs_checklist_filter = erpnext.salary_slip_deductions_report_filters + ecs_checklist_filter['filters'].push({ + fieldname: "type", + label: __("Type"), + fieldtype: "Select", + options:["", "Bank", "Cash", "Cheque"] + }) + + frappe.query_reports["Salary Payments via ECS"] = ecs_checklist_filter +}); diff --git a/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.json b/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.json new file mode 100644 index 00000000000..dd0ac7c4ef7 --- /dev/null +++ b/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.json @@ -0,0 +1,27 @@ +{ + "add_total_row": 0, + "creation": "2020-06-16 18:35:30.508143", + "disable_prepared_report": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "modified": "2020-06-16 18:38:23.680185", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Salary Payments via ECS", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Salary Slip", + "report_name": "Salary Payments via ECS", + "report_type": "Script Report", + "roles": [ + { + "role": "HR Manager" + }, + { + "role": "HR User" + } + ] +} \ No newline at end of file diff --git a/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py b/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py new file mode 100644 index 00000000000..afd5c13b32e --- /dev/null +++ b/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py @@ -0,0 +1,146 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe, erpnext +from frappe import _ + +def execute(filters=None): + columns = get_columns(filters) + data = get_data(filters) + + return columns, data + +def get_columns(filters): + columns = [ + { + "label": _("Branch"), + "options": "Branch", + "fieldname": "branch", + "fieldtype": "Link", + "width": 200 + }, + { + "label": _("Employee Name"), + "options": "Employee", + "fieldname": "employee_name", + "fieldtype": "Link", + "width": 160 + }, + { + "label": _("Employee"), + "options":"Employee", + "fieldname": "employee", + "fieldtype": "Link", + "width": 140 + }, + { + "label": _("Gross Pay"), + "fieldname": "gross_pay", + "fieldtype": "Currency", + "options": "currency", + "width": 140 + }, + { + "label": _("Bank"), + "fieldname": "bank", + "fieldtype": "Data", + "width": 140 + }, + { + "label": _("Account No"), + "fieldname": "account_no", + "fieldtype": "Data", + "width": 140 + }, + ] + if erpnext.get_region() == "India": + columns += [ + { + "label": _("IFSC"), + "fieldname": "ifsc", + "fieldtype": "Data", + "width": 140 + }, + { + "label": _("MICR"), + "fieldname": "micr", + "fieldtype": "Data", + "width": 140 + } + ] + + return columns + +def get_conditions(filters): + conditions = [""] + + if filters.get("department"): + conditions.append("department = '%s' " % (filters["department"]) ) + + if filters.get("branch"): + conditions.append("branch = '%s' " % (filters["branch"]) ) + + if filters.get("company"): + conditions.append("company = '%s' " % (filters["company"]) ) + + if filters.get("period"): + conditions.append("month(start_date) = '%s' " % (filters["period"])) + + return " and ".join(conditions) + +def get_data(filters): + + data = [] + + fields = ["employee", "branch", "bank_name", "bank_ac_no", "salary_mode"] + if erpnext.get_region() == "India": + fields += ["ifsc_code", "micr_code"] + + + employee_details = frappe.get_list("Employee", fields = fields) + employee_data_dict = {} + + for d in employee_details: + employee_data_dict.setdefault( + d.employee,{ + "bank_ac_no" : d.bank_ac_no, + "ifsc_code" : d.ifsc_code or None, + "micr_code" : d.micr_code or None, + "branch" : d.branch, + "salary_mode" : d.salary_mode, + "bank_name": d.bank_name + } + ) + + conditions = get_conditions(filters) + + entry = frappe.db.sql(""" select employee, employee_name, gross_pay + from `tabSalary Slip` + where docstatus = 1 %s """ + %(conditions), as_dict =1) + + for d in entry: + + employee = { + "branch" : employee_data_dict.get(d.employee).get("branch"), + "employee_name" : d.employee_name, + "employee" : d.employee, + "gross_pay" : d.gross_pay, + } + + if employee_data_dict.get(d.employee).get("salary_mode") == "Bank": + employee["bank"] = employee_data_dict.get(d.employee).get("bank_name") + employee["account_no"] = employee_data_dict.get(d.employee).get("bank_ac_no") + if erpnext.get_region() == "India": + employee["ifsc"] = employee_data_dict.get(d.employee).get("ifsc_code") + employee["micr"] = employee_data_dict.get(d.employee).get("micr_code") + else: + employee["account_no"] = employee_data_dict.get(d.employee).get("salary_mode") + + if filters.get("type") and employee_data_dict.get(d.employee).get("salary_mode") == filters.get("type"): + data.append(employee) + elif not filters.get("type"): + data.append(employee) + + return data diff --git a/erpnext/payroll/report/salary_register/__init__.py b/erpnext/payroll/report/salary_register/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/hr/report/salary_register/salary_register.html b/erpnext/payroll/report/salary_register/salary_register.html similarity index 100% rename from erpnext/hr/report/salary_register/salary_register.html rename to erpnext/payroll/report/salary_register/salary_register.html diff --git a/erpnext/hr/report/salary_register/salary_register.js b/erpnext/payroll/report/salary_register/salary_register.js similarity index 100% rename from erpnext/hr/report/salary_register/salary_register.js rename to erpnext/payroll/report/salary_register/salary_register.js diff --git a/erpnext/payroll/report/salary_register/salary_register.json b/erpnext/payroll/report/salary_register/salary_register.json new file mode 100644 index 00000000000..5a70c325939 --- /dev/null +++ b/erpnext/payroll/report/salary_register/salary_register.json @@ -0,0 +1,27 @@ +{ + "add_total_row": 1, + "creation": "2017-01-10 17:36:58.153863", + "disable_prepared_report": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 2, + "is_standard": "Yes", + "modified": "2020-05-28 00:07:18.576661", + "modified_by": "Administrator", + "module": "Payroll", + "name": "Salary Register", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Salary Slip", + "report_name": "Salary Register", + "report_type": "Script Report", + "roles": [ + { + "role": "HR User" + }, + { + "role": "HR Manager" + } + ] +} \ No newline at end of file diff --git a/erpnext/hr/report/salary_register/salary_register.py b/erpnext/payroll/report/salary_register/salary_register.py similarity index 96% rename from erpnext/hr/report/salary_register/salary_register.py rename to erpnext/payroll/report/salary_register/salary_register.py index ea7fc06cff1..87010855fdb 100644 --- a/erpnext/hr/report/salary_register/salary_register.py +++ b/erpnext/payroll/report/salary_register/salary_register.py @@ -55,8 +55,8 @@ def get_columns(salary_slips): columns = [ _("Salary Slip ID") + ":Link/Salary Slip:150",_("Employee") + ":Link/Employee:120", _("Employee Name") + "::140", _("Date of Joining") + "::80", _("Branch") + ":Link/Branch:-1", _("Department") + ":Link/Department:-1", - _("Designation") + ":Link/Designation:-1", _("Company") + ":Link/Company:120", _("Start Date") + "::80", - _("End Date") + "::80", _("Leave Without Pay") + ":Float:-1", _("Payment Days") + ":Float:120" + _("Designation") + ":Link/Designation:120", _("Company") + ":Link/Company:120", _("Start Date") + "::80", + _("End Date") + "::80", _("Leave Without Pay") + ":Float:50", _("Payment Days") + ":Float:120" ] salary_components = {_("Earning"): [], _("Deduction"): []} diff --git a/erpnext/projects/doctype/timesheet/test_timesheet.py b/erpnext/projects/doctype/timesheet/test_timesheet.py index cbc624c064f..03b67b10231 100644 --- a/erpnext/projects/doctype/timesheet/test_timesheet.py +++ b/erpnext/projects/doctype/timesheet/test_timesheet.py @@ -11,7 +11,7 @@ from frappe.utils import now_datetime, nowdate, add_days, add_months from erpnext.projects.doctype.timesheet.timesheet import OverlapError from erpnext.projects.doctype.timesheet.timesheet import make_salary_slip, make_sales_invoice from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice -from erpnext.hr.doctype.salary_structure.test_salary_structure \ +from erpnext.payroll.doctype.salary_structure.test_salary_structure \ import make_salary_structure, create_salary_structure_assignment from erpnext.hr.doctype.employee.test_employee import make_employee diff --git a/erpnext/public/js/salary_slip_deductions_report_filters.js b/erpnext/public/js/salary_slip_deductions_report_filters.js new file mode 100644 index 00000000000..242037991aa --- /dev/null +++ b/erpnext/public/js/salary_slip_deductions_report_filters.js @@ -0,0 +1,47 @@ +frappe.provide("erpnext.salary_slip_deductions_report_filters"); + +erpnext.salary_slip_deductions_report_filters = { + "filters": [ + { + fieldname: "company", + label: __("Company"), + fieldtype: "Link", + options: "Company", + reqd:1, + default: frappe.defaults.get_user_default("Company"), + }, + { + fieldname: "period", + label: __("Period"), + fieldtype: "Select", + reqd: 1 , + options: [ + { "value": 1, "label": __("Jan") }, + { "value": 2, "label": __("Feb") }, + { "value": 3, "label": __("Mar") }, + { "value": 4, "label": __("Apr") }, + { "value": 5, "label": __("May") }, + { "value": 6, "label": __("June") }, + { "value": 7, "label": __("July") }, + { "value": 8, "label": __("Aug") }, + { "value": 9, "label": __("Sep") }, + { "value": 10, "label": __("Oct") }, + { "value": 11, "label": __("Nov") }, + { "value": 12, "label": __("Dec") }, + ], + default: frappe.datetime.str_to_obj(frappe.datetime.get_today()).getMonth() + 1 + }, + { + fieldname: "department", + label: __("Department"), + fieldtype: "Link", + options: "Department", + }, + { + fieldname: "branch", + label: __("Barnch"), + fieldtype: "Link", + options: "Branch", + } + ] +} \ No newline at end of file diff --git a/erpnext/regional/india/setup.py b/erpnext/regional/india/setup.py index 8593966cc3a..290694a7899 100644 --- a/erpnext/regional/india/setup.py +++ b/erpnext/regional/india/setup.py @@ -60,6 +60,19 @@ def add_custom_roles_for_reports(): ] )).insert() + for report_name in ('Professional Tax Deductions', 'Provident Fund Deductions'): + + if not frappe.db.get_value('Custom Role', dict(report=report_name)): + frappe.get_doc(dict( + doctype='Custom Role', + report=report_name, + roles= [ + dict(role='HR User'), + dict(role='HR Manager'), + dict(role='Employee') + ] + )).insert() + def add_permissions(): for doctype in ('GST HSN Code', 'GST Settings', 'GSTR 3B Report', 'Lower Deduction Certificate'): add_permission(doctype, 'All', 0) @@ -402,10 +415,45 @@ def make_custom_fields(update=True): 'Purchase Receipt Item': [hsn_sac_field, nil_rated_exempt, is_non_gst], 'Purchase Invoice Item': [hsn_sac_field, nil_rated_exempt, is_non_gst], 'Material Request Item': [hsn_sac_field, nil_rated_exempt, is_non_gst], + 'Salary Component': [ + dict(fieldname= 'component_type', + label= 'Component Type', + fieldtype= 'Select', + insert_after= 'description', + options= "\nProvident Fund\nAdditional Provident Fund\nProvident Fund Loan\nProfessional Tax", + depends_on = 'eval:doc.type == "Deduction"' + ) + ], 'Employee': [ - dict(fieldname='ifsc_code', label='IFSC Code', - fieldtype='Data', insert_after='bank_ac_no', print_hide=1, - depends_on='eval:doc.salary_mode == "Bank"') + dict(fieldname='ifsc_code', + label='IFSC Code', + fieldtype='Data', + insert_after='bank_ac_no', + print_hide=1, + depends_on='eval:doc.salary_mode == "Bank"' + ), + dict( + fieldname = 'pan_number', + label = 'PAN Number', + fieldtype = 'Data', + insert_after = 'payroll_cost_center', + print_hide = 1 + ), + dict( + fieldname = 'micr_code', + label = 'MICR Code', + fieldtype = 'Data', + insert_after = 'ifsc_code', + print_hide = 1, + depends_on='eval:doc.salary_mode == "Bank"' + ), + dict( + fieldname = 'provident_fund_account', + label = 'Provident Fund Account', + fieldtype = 'Data', + insert_after = 'pan_number' + ) + ], 'Company': [ dict(fieldname='hra_section', label='HRA Settings', diff --git a/erpnext/regional/india/utils.py b/erpnext/regional/india/utils.py index 9fe29eba1b8..05ffa87f144 100644 --- a/erpnext/regional/india/utils.py +++ b/erpnext/regional/india/utils.py @@ -6,7 +6,7 @@ from erpnext.regional.india import states, state_numbers from erpnext.controllers.taxes_and_totals import get_itemised_tax, get_itemised_taxable_amount from erpnext.controllers.accounts_controller import get_taxes_and_charges from erpnext.hr.utils import get_salary_assignment -from erpnext.hr.doctype.salary_structure.salary_structure import make_salary_slip +from erpnext.payroll.doctype.salary_structure.salary_structure import make_salary_slip from erpnext.regional.india import number_state_mapping from six import string_types from erpnext.accounts.general_ledger import make_gl_entries diff --git a/erpnext/regional/report/professional_tax_deductions/__init__.py b/erpnext/regional/report/professional_tax_deductions/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.js b/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.js new file mode 100644 index 00000000000..29c7dbf43c6 --- /dev/null +++ b/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.js @@ -0,0 +1,7 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.require("assets/erpnext/js/salary_slip_deductions_report_filters.js", function() { + frappe.query_reports["Professional Tax Deductions"] = erpnext.salary_slip_deductions_report_filters; +}); \ No newline at end of file diff --git a/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.json b/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.json new file mode 100644 index 00000000000..9938e9db524 --- /dev/null +++ b/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.json @@ -0,0 +1,20 @@ +{ + "add_total_row": 0, + "creation": "2020-06-02 00:37:44.537355", + "disable_prepared_report": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "modified": "2020-06-16 19:02:26.306348", + "modified_by": "Administrator", + "module": "Regional", + "name": "Professional Tax Deductions", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Salary Slip", + "report_name": "Professional Tax Deductions", + "report_type": "Script Report", + "roles": [] +} \ No newline at end of file diff --git a/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.py b/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.py new file mode 100644 index 00000000000..900fe963b4b --- /dev/null +++ b/erpnext/regional/report/professional_tax_deductions/professional_tax_deductions.py @@ -0,0 +1,69 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from erpnext.regional.report.provident_fund_deductions.provident_fund_deductions import get_conditions + +def execute(filters=None): + columns = get_columns(filters) + data = get_data(filters) + + return columns, data + +def get_columns(filters): + columns = [ + { + "label": _("Employee"), + "options": "Employee", + "fieldname": "employee", + "fieldtype": "Link", + "width": 200 + }, + { + "label": _("Employee Name"), + "options": "Employee", + "fieldname": "employee_name", + "fieldtype": "Link", + "width": 160 + }, + { + "label": _("Amount"), + "fieldname": "amount", + "fieldtype": "Currency", + "width": 140 + } + ] + + return columns + +def get_data(filters): + + data = [] + + component_type_dict = frappe._dict(frappe.db.sql(""" select name, component_type from `tabSalary Component` + where component_type = 'Professional Tax' """)) + + conditions = get_conditions(filters) + + entry = frappe.db.sql(""" select sal.employee, sal.employee_name, ded.salary_component, ded.amount + from `tabSalary Slip` sal, `tabSalary Detail` ded + where sal.name = ded.parent + and ded.parentfield = 'deductions' + and ded.parenttype = 'Salary Slip' + and sal.docstatus = 1 %s + and ded.salary_component in (%s) + """ % (conditions , ", ".join(['%s']*len(component_type_dict))), tuple(component_type_dict.keys()), as_dict=1) + + for d in entry: + + employee = { + "employee": d.employee, + "employee_name": d.employee_name, + "amount": d.amount + } + + data.append(employee) + + return data \ No newline at end of file diff --git a/erpnext/regional/report/provident_fund_deductions/__init__.py b/erpnext/regional/report/provident_fund_deductions/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.js b/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.js new file mode 100644 index 00000000000..b4dc28d177d --- /dev/null +++ b/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.js @@ -0,0 +1,7 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.require("assets/erpnext/js/salary_slip_deductions_report_filters.js", function() { + frappe.query_reports["Provident Fund Deductions"] = erpnext.salary_slip_deductions_report_filters; +}); \ No newline at end of file diff --git a/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.json b/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.json new file mode 100644 index 00000000000..e25d335f9bd --- /dev/null +++ b/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.json @@ -0,0 +1,20 @@ +{ + "add_total_row": 0, + "creation": "2020-06-01 23:44:07.919117", + "disable_prepared_report": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "modified": "2020-06-16 18:54:19.305763", + "modified_by": "Administrator", + "module": "Regional", + "name": "Provident Fund Deductions", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Salary Slip", + "report_name": "Provident Fund Deductions", + "report_type": "Script Report", + "roles": [] +} \ No newline at end of file diff --git a/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.py b/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.py new file mode 100644 index 00000000000..9f58957fed8 --- /dev/null +++ b/erpnext/regional/report/provident_fund_deductions/provident_fund_deductions.py @@ -0,0 +1,153 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ + +def execute(filters=None): + columns = get_columns(filters) + data = get_data(filters) + + return columns, data + +def get_columns(filters): + columns = [ + { + "label": _("Employee"), + "options": "Employee", + "fieldname": "employee", + "fieldtype": "Link", + "width": 200 + }, + { + "label": _("Employee Name"), + "options": "Employee", + "fieldname": "employee_name", + "fieldtype": "Link", + "width": 160 + }, + { + "label": _("PF Account"), + "fieldname": "pf_account", + "fieldtype": "Data", + "width": 140 + }, + { + "label": _("PF Amount"), + "fieldname": "pf_amount", + "fieldtype": "Currency", + "width": 140 + }, + { + "label": _("Additional PF"), + "fieldname": "additional_pf", + "fieldtype": "Currency", + "width": 140 + }, + { + "label": _("PF Loan"), + "fieldname": "pf_loan", + "fieldtype": "Currency", + "width": 140 + }, + { + "label": _("Total"), + "fieldname": "total", + "fieldtype": "Currency", + "width": 140 + } + ] + + return columns + +def get_conditions(filters): + conditions = [""] + + if filters.get("department"): + conditions.append("sal.department = '%s' " % (filters["department"]) ) + + if filters.get("branch"): + conditions.append("sal.branch = '%s' " % (filters["branch"]) ) + + if filters.get("company"): + conditions.append("sal.company = '%s' " % (filters["company"]) ) + + if filters.get("period"): + conditions.append("month(sal.start_date) = '%s' " % (filters["period"])) + + if filters.get("mode_of_payment"): + conditions.append("sal.mode_of_payment = '%s' " % (filters["mode_of_payment"])) + + return " and ".join(conditions) + +def prepare_data(entry,component_type_dict): + data_list = {} + + employee_account_dict = frappe._dict(frappe.db.sql(""" select name, provident_fund_account from `tabEmployee`""")) + + for d in entry: + + component_type = component_type_dict.get(d.salary_component) + + if data_list.get(d.name): + data_list[d.name][component_type] = d.amount + else: + data_list.setdefault(d.name,{ + "employee": d.employee, + "employee_name": d.employee_name, + "pf_account": employee_account_dict.get(d.employee), + "component_type": d.amount + }) + + return data_list + +def get_data(filters): + data = [] + + conditions = get_conditions(filters) + + salary_slips = frappe.db.sql(""" select sal.name from `tabSalary Slip` sal + where docstatus = 1 %s + """ % (conditions), as_dict=1) + + component_type_dict = frappe._dict(frappe.db.sql(""" select name, component_type from `tabSalary Component` + where component_type in ('Provident Fund', 'Additional Provident Fund', 'Provident Fund Loan')""")) + + entry = frappe.db.sql(""" select sal.name, sal.employee, sal.employee_name, ded.salary_component, ded.amount + from `tabSalary Slip` sal, `tabSalary Detail` ded + where sal.name = ded.parent + and ded.parentfield = 'deductions' + and ded.parenttype = 'Salary Slip' + and sal.docstatus = 1 %s + and ded.salary_component in (%s) + """ % (conditions, ", ".join(['%s']*len(component_type_dict))), tuple(component_type_dict.keys()), as_dict=1) + + data_list = prepare_data(entry,component_type_dict) + + for d in salary_slips: + total = 0 + if data_list.get(d.name): + employee = { + "employee": data_list.get(d.name).get("employee"), + "employee_name": data_list.get(d.name).get("employee_name"), + "pf_account": data_list.get(d.name).get("pf_account") + } + + if data_list.get(d.name).get("Provident Fund"): + employee["pf_amount"] = data_list.get(d.name).get("Provident Fund") + total += data_list.get(d.name).get("Provident Fund") + + if data_list.get(d.name).get("Additional Provident Fund"): + employee["additional_pf"] = data_list.get(d.name).get("Additional Provident Fund") + total += data_list.get(d.name).get("Additional Provident Fund") + + if data_list.get(d.name).get("Provident Fund Loan"): + employee["pf_loan"] = data_list.get(d.name).get("Provident Fund Loan") + total += data_list.get(d.name).get("Provident Fund Loan") + + employee["total"] = total + + data.append(employee) + + return data \ No newline at end of file diff --git a/erpnext/setup/setup_wizard/operations/install_fixtures.py b/erpnext/setup/setup_wizard/operations/install_fixtures.py index 0d70d91f739..ad063cfc9d1 100644 --- a/erpnext/setup/setup_wizard/operations/install_fixtures.py +++ b/erpnext/setup/setup_wizard/operations/install_fixtures.py @@ -50,7 +50,7 @@ def install(country=None): 'is_group': 0, 'parent_item_group': _('All Item Groups') }, # salary component - {'doctype': 'Salary Component', 'salary_component': _('Income Tax'), 'description': _('Income Tax'), 'type': 'Deduction'}, + {'doctype': 'Salary Component', 'salary_component': _('Income Tax'), 'description': _('Income Tax'), 'type': 'Deduction', 'is_income_tax_component': 1}, {'doctype': 'Salary Component', 'salary_component': _('Basic'), 'description': _('Basic'), 'type': 'Earning'}, {'doctype': 'Salary Component', 'salary_component': _('Arrear'), 'description': _('Arrear'), 'type': 'Earning'}, {'doctype': 'Salary Component', 'salary_component': _('Leave Encashment'), 'description': _('Leave Encashment'), 'type': 'Earning'}, From 2bf8d60d7e3c44db7ce90aaa9184afe6b0c93d9b Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Fri, 19 Jun 2020 22:25:55 +0530 Subject: [PATCH 50/66] fix: rogue s/codacy --- .../accounts/doctype/purchase_invoice/purchase_invoice_list.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js index e9849c20502..86c2e408c0b 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js @@ -24,5 +24,4 @@ frappe.listview_settings['Purchase Invoice'] = { return [__("Paid"), "green", "outstanding_amount,=,0"]; } } -}; -s \ No newline at end of file +}; \ No newline at end of file From 802c30021824f63c433f3cab88c24d0b05af025e Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Fri, 19 Jun 2020 22:29:55 +0530 Subject: [PATCH 51/66] Revert "fix: rogue s/codacy" This reverts commit 2bf8d60d7e3c44db7ce90aaa9184afe6b0c93d9b. --- .../accounts/doctype/purchase_invoice/purchase_invoice_list.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js index 86c2e408c0b..e9849c20502 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js @@ -24,4 +24,5 @@ frappe.listview_settings['Purchase Invoice'] = { return [__("Paid"), "green", "outstanding_amount,=,0"]; } } -}; \ No newline at end of file +}; +s \ No newline at end of file From b7c8037e9a8f8a87afa5b6aff47546545552848e Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Fri, 19 Jun 2020 22:33:51 +0530 Subject: [PATCH 52/66] fix codacy --- .../accounts/doctype/purchase_invoice/purchase_invoice_list.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js index e9849c20502..86c2e408c0b 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js @@ -24,5 +24,4 @@ frappe.listview_settings['Purchase Invoice'] = { return [__("Paid"), "green", "outstanding_amount,=,0"]; } } -}; -s \ No newline at end of file +}; \ No newline at end of file From 3fbe6e9e4b2489f8f749497597e4eb32430577da Mon Sep 17 00:00:00 2001 From: Afshan Date: Fri, 19 Jun 2020 22:51:52 +0530 Subject: [PATCH 53/66] fix: test case --- .../report/sales_analytics/test_analytics.py | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/erpnext/selling/report/sales_analytics/test_analytics.py b/erpnext/selling/report/sales_analytics/test_analytics.py index 7e8501dcc15..4d81a1e4dda 100644 --- a/erpnext/selling/report/sales_analytics/test_analytics.py +++ b/erpnext/selling/report/sales_analytics/test_analytics.py @@ -33,21 +33,6 @@ class TestAnalytics(unittest.TestCase): report = execute(filters) expected_data = [ - { - 'entity': 'Total', - 'apr_2017': 0.0, - 'may_2017': 0.0, - 'jun_2017': 2000.0, - 'jul_2017': 1000.0, - 'aug_2017': 0.0, - 'sep_2017': 1500.0, - 'oct_2017': 1000.0, - 'nov_2017': 0.0, - 'dec_2017': 0.0, - 'jan_2018': 0.0, - 'feb_2018': 2000.0, - 'mar_2018': 0.0 - }, { "entity": "_Test Customer 1", "entity_name": "_Test Customer 1", @@ -149,21 +134,6 @@ class TestAnalytics(unittest.TestCase): report = execute(filters) expected_data = [ - { - 'entity': 'Total', - 'apr_2017': 0.0, - 'may_2017': 0.0, - 'jun_2017': 20.0, - 'jul_2017': 10.0, - 'aug_2017': 0.0, - 'sep_2017': 15.0, - 'oct_2017': 10.0, - 'nov_2017': 0.0, - 'dec_2017': 0.0, - 'jan_2018': 0.0, - 'feb_2018': 20.0, - 'mar_2018': 0.0 - }, { "entity": "_Test Customer 1", "entity_name": "_Test Customer 1", From d39c97e281cadc862550c0640881f06d1bf62f58 Mon Sep 17 00:00:00 2001 From: Revant Nandgaonkar Date: Fri, 19 Jun 2020 23:56:53 +0530 Subject: [PATCH 54/66] fix: trigger docker build on release (#22353) --- .github/workflows/docker-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index 8f678583066..4b1147e79f9 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -1,7 +1,7 @@ name: Trigger Docker build on release on: release: - types: [created] + types: [released] jobs: curl: runs-on: ubuntu-latest From bef80b7981b721f470a15b95bc5831d438b50132 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sat, 20 Jun 2020 12:32:30 +0530 Subject: [PATCH 55/66] fix: Test --- .../account_balance/test_account_balance.py | 2 +- .../test_accounts_receivable.py | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/erpnext/accounts/report/account_balance/test_account_balance.py b/erpnext/accounts/report/account_balance/test_account_balance.py index 5544fc46738..b6ced312d09 100644 --- a/erpnext/accounts/report/account_balance/test_account_balance.py +++ b/erpnext/accounts/report/account_balance/test_account_balance.py @@ -61,7 +61,7 @@ def make_sales_invoice(): debit_to = 'Debtors - _TC2', income_account = 'Sales - _TC2', expense_account = 'Cost of Goods Sold - _TC2', - cost_center = '_Test Company 2 - _TC2') + cost_center = 'Main - _TC2') diff --git a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py index f0274b44723..2ff5b531c51 100644 --- a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py @@ -63,7 +63,7 @@ def make_sales_invoice(): debit_to = 'Debtors - _TC2', income_account = 'Sales - _TC2', expense_account = 'Cost of Goods Sold - _TC2', - cost_center = '_Test Company 2 - _TC2', + cost_center = 'Main - _TC2', do_not_save=1) si.append('payment_schedule', dict(due_date=getdate(add_days(today(), 30)), invoice_portion=30.00, payment_amount=30)) @@ -83,14 +83,14 @@ def make_payment(docname): def make_credit_note(docname): create_sales_invoice(company="_Test Company 2", - customer = '_Test Customer 2', - currency = 'EUR', - qty = -1, - warehouse = 'Finished Goods - _TC2', - debit_to = 'Debtors - _TC2', - income_account = 'Sales - _TC2', - expense_account = 'Cost of Goods Sold - _TC2', - cost_center = '_Test Company 2 - _TC2', - is_return = 1, - return_against = docname) + customer = '_Test Customer 2', + currency = 'EUR', + qty = -1, + warehouse = 'Finished Goods - _TC2', + debit_to = 'Debtors - _TC2', + income_account = 'Sales - _TC2', + expense_account = 'Cost of Goods Sold - _TC2', + cost_center = 'Main - _TC2', + is_return = 1, + return_against = docname) From 84c69737421770163f96f712c72e1a2275b15267 Mon Sep 17 00:00:00 2001 From: Afshan Date: Sun, 21 Jun 2020 17:48:44 +0530 Subject: [PATCH 56/66] fix: adding json for checked add total row --- erpnext/selling/report/sales_analytics/sales_analytics.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/report/sales_analytics/sales_analytics.json b/erpnext/selling/report/sales_analytics/sales_analytics.json index bf9edd6cd49..de5c3a6b2a7 100644 --- a/erpnext/selling/report/sales_analytics/sales_analytics.json +++ b/erpnext/selling/report/sales_analytics/sales_analytics.json @@ -1,5 +1,5 @@ { - "add_total_row": 0, + "add_total_row": 1, "creation": "2018-09-21 12:46:29.451048", "disable_prepared_report": 0, "disabled": 0, @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 0, "is_standard": "Yes", - "modified": "2020-04-30 19:49:02.303320", + "modified": "2020-06-19 17:41:03.132101", "modified_by": "Administrator", "module": "Selling", "name": "Sales Analytics", From 43be163b32a0f201389ca9d8e4c4918d49730530 Mon Sep 17 00:00:00 2001 From: Alvaro Date: Mon, 22 Jun 2020 07:36:12 +0200 Subject: [PATCH 57/66] feat: Enabled translation on html files in LMS [Proposal] (#21582) * :fix: translation fix for html files in LMS * fix: typo in translation * Update content.html * Update content.html * Update profile.html Co-authored-by: Shivam Mishra Co-authored-by: Marica --- erpnext/www/lms/content.html | 22 +++++++++++----------- erpnext/www/lms/course.html | 6 +++--- erpnext/www/lms/index.html | 2 +- erpnext/www/lms/macros/card.html | 4 ++-- erpnext/www/lms/macros/hero.html | 10 +++++----- erpnext/www/lms/profile.html | 8 ++++---- erpnext/www/lms/program.html | 6 +++--- erpnext/www/lms/topic.html | 10 +++++----- 8 files changed, 34 insertions(+), 34 deletions(-) diff --git a/erpnext/www/lms/content.html b/erpnext/www/lms/content.html index cdc71412c48..dc9b6d80fb5 100644 --- a/erpnext/www/lms/content.html +++ b/erpnext/www/lms/content.html @@ -59,7 +59,7 @@ {% macro title() %}
@@ -69,15 +69,15 @@ {% macro navigation() %} {% if previous %} - Previous + {{_('Previous')}} {% else %} - Back to Course + {{ _('Back to Course') }} {% endif %} {% if next %} - + {% else %} - + {% endif %} {% endmacro %} @@ -86,7 +86,7 @@ {{ title() }}
{% if content.duration %} - {{ content.duration }} Mins + {{ content.duration }} {{_('Mins')}} {% endif %} {% if content.publish_date and content.duration%} @@ -94,7 +94,7 @@ {% endif %} {% if content.publish_date %} - Published on {{ content.publish_date.strftime('%d, %b %Y') }} + {{_('Published on')}} {{ content.publish_date.strftime('%d, %b %Y') }} {% endif %}
@@ -109,13 +109,13 @@ {{ title() }}
{% if content.author or content.publish_date %} - Published + {{_('Published')}} {% endif %} {% if content.author %} - by {{ content.author }} + {{_('by')}} {{ content.author }} {% endif %} {% if content.publish_date %} - on {{ content.publish_date.strftime('%d, %b %Y') }} + {{_('on')}} {{ content.publish_date.strftime('%d, %b %Y') }} {% endif %}
@@ -205,4 +205,4 @@ {% endif %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/erpnext/www/lms/course.html b/erpnext/www/lms/course.html index f2fd9363e8c..0d70ed5cefd 100644 --- a/erpnext/www/lms/course.html +++ b/erpnext/www/lms/course.html @@ -72,11 +72,11 @@ {% if has_access %} diff --git a/erpnext/www/lms/index.html b/erpnext/www/lms/index.html index ffb4419f367..7ce3521273f 100644 --- a/erpnext/www/lms/index.html +++ b/erpnext/www/lms/index.html @@ -45,7 +45,7 @@

{{ education_settings.description }}

{% if frappe.session.user == 'Guest' %} - Sign Up + {{_('Sign Up')}} {% endif %}

diff --git a/erpnext/www/lms/macros/card.html b/erpnext/www/lms/macros/card.html index 076061d41b3..dc8fc5c72c7 100644 --- a/erpnext/www/lms/macros/card.html +++ b/erpnext/www/lms/macros/card.html @@ -15,8 +15,8 @@ {% if has_access or program.intro_video%} {% endif %} diff --git a/erpnext/www/lms/macros/hero.html b/erpnext/www/lms/macros/hero.html index 66bb861c467..94f239eb8ed 100644 --- a/erpnext/www/lms/macros/hero.html +++ b/erpnext/www/lms/macros/hero.html @@ -2,16 +2,16 @@

{{ title }}

{{ description or ''}}

{% if frappe.session.user == 'Guest' %} - Sign Up + {{_('Sign Up')}} {% elif not has_access %} - + {% endif %}

@@ -28,7 +28,7 @@ let btn = document.getElementById('enroll'); btn.disbaled = true; - btn.innerText = 'Enrolling...' + btn.innerText = __('Enrolling...') let opts = { method: 'erpnext.education.utils.enroll_in_program', @@ -44,7 +44,7 @@ window.location.reload() } }) - success_dialog.set_message('You have successfully enrolled for the program '); + success_dialog.set_message(__('You have successfully enrolled for the program ')); success_dialog.$message.show() success_dialog.show(); btn.disbaled = false; diff --git a/erpnext/www/lms/profile.html b/erpnext/www/lms/profile.html index 9508daedb71..5755dfe6d8e 100644 --- a/erpnext/www/lms/profile.html +++ b/erpnext/www/lms/profile.html @@ -30,7 +30,7 @@ @@ -43,11 +43,11 @@

{{ student.first_name }} {{ student.last_name or '' }}

@@ -61,4 +61,4 @@ -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/erpnext/www/lms/program.html b/erpnext/www/lms/program.html index 271b7813bb4..7ad618630a4 100644 --- a/erpnext/www/lms/program.html +++ b/erpnext/www/lms/program.html @@ -55,11 +55,11 @@ {% if has_access and progress[course.name] %} {% endif %} diff --git a/erpnext/www/lms/topic.html b/erpnext/www/lms/topic.html index 1f0d1876646..cd24616cd45 100644 --- a/erpnext/www/lms/topic.html +++ b/erpnext/www/lms/topic.html @@ -23,13 +23,13 @@ {% if has_access %} From 8ffb9f852f7b825e3acc6aa43c21f6b40fb50e41 Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Mon, 22 Jun 2020 12:17:29 +0530 Subject: [PATCH 58/66] fix: patch check_is_income_tax_component (#22371) --- erpnext/patches.txt | 6 +++--- .../v13_0/check_is_income_tax_component.py | 21 ++++++++++++++++++- .../additional_salary/additional_salary.json | 2 +- .../employee_benefit_application.json | 2 +- .../employee_benefit_application_detail.json | 2 +- .../employee_benefit_claim.json | 2 +- .../employee_incentive.json | 2 +- .../employee_other_income.json | 2 +- .../employee_tax_exemption_category.json | 2 +- .../employee_tax_exemption_declaration.json | 2 +- ...ee_tax_exemption_declaration_category.json | 2 +- ...ployee_tax_exemption_proof_submission.json | 2 +- ...tax_exemption_proof_submission_detail.json | 2 +- .../employee_tax_exemption_sub_category.json | 2 +- .../income_tax_slab/income_tax_slab.json | 2 +- .../income_tax_slab_other_charges.json | 2 +- .../payroll_employee_detail.json | 2 +- .../doctype/payroll_entry/payroll_entry.json | 2 +- .../payroll_period/payroll_period.json | 2 +- .../payroll_period_date.json | 2 +- .../payroll_settings/payroll_settings.json | 2 +- .../retention_bonus/retention_bonus.json | 2 +- .../salary_component/salary_component.json | 2 +- .../doctype/salary_detail/salary_detail.json | 2 +- .../doctype/salary_slip/salary_slip.json | 2 +- .../salary_slip_timesheet.json | 2 +- .../salary_structure/salary_structure.json | 2 +- .../salary_structure_assignment.json | 2 +- .../taxable_salary_slab.json | 2 +- 29 files changed, 50 insertions(+), 31 deletions(-) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index b17cc474447..928c0ab9d86 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -702,6 +702,6 @@ erpnext.patches.v12_0.update_address_template_for_india erpnext.patches.v12_0.set_multi_uom_in_rfq erpnext.patches.v13_0.delete_old_sales_reports execute:frappe.delete_doc_if_exists("DocType", "Bank Reconciliation") -erpnext.patches.v13_0.move_doctype_reports_and_notification_from_hr_to_payroll -erpnext.patches.v13_0.move_payroll_setting_separately_from_hr_settings -erpnext.patches.v13_0.check_is_income_tax_component +erpnext.patches.v13_0.move_doctype_reports_and_notification_from_hr_to_payroll #22-06-2020 +erpnext.patches.v13_0.move_payroll_setting_separately_from_hr_settings #22-06-2020 +erpnext.patches.v13_0.check_is_income_tax_component #22-06-2020 diff --git a/erpnext/patches/v13_0/check_is_income_tax_component.py b/erpnext/patches/v13_0/check_is_income_tax_component.py index f69412c5383..9ad48e23b7f 100644 --- a/erpnext/patches/v13_0/check_is_income_tax_component.py +++ b/erpnext/patches/v13_0/check_is_income_tax_component.py @@ -4,9 +4,28 @@ from __future__ import unicode_literals import frappe, erpnext +from erpnext.regional.india.setup import setup def execute(): - frappe.reload_doc('Payroll', 'doctype', 'salary_structure') + + doctypes = ['salary_component', + 'Employee Tax Exemption Declaration', + 'Employee Tax Exemption Proof Submission', + 'Employee Tax Exemption Declaration Category', + 'Employee Tax Exemption Proof Submission Detail' + ] + + for doctype in doctypes: + frappe.reload_doc('Payroll', 'doctype', doctype) + + + reports = ['Professional Tax Deductions', 'Provident Fund Deductions'] + for report in reports: + frappe.reload_doc('Regional', 'Report', report) + frappe.reload_doc('Regional', 'Report', report) + + if erpnext.get_region() == "India": + setup(patch=True) if frappe.db.exists("Salary Component", "Income Tax"): frappe.db.set_value("Salary Component", "Income Tax", "is_income_tax_component", 1) diff --git a/erpnext/payroll/doctype/additional_salary/additional_salary.json b/erpnext/payroll/doctype/additional_salary/additional_salary.json index ad64289f0d2..69cb5da893e 100644 --- a/erpnext/payroll/doctype/additional_salary/additional_salary.json +++ b/erpnext/payroll/doctype/additional_salary/additional_salary.json @@ -163,7 +163,7 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-05-27 21:10:50.374063", + "modified": "2020-06-22 21:10:50.374063", "modified_by": "Administrator", "module": "Payroll", "name": "Additional Salary", diff --git a/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.json b/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.json index 275c855b687..b0c1bd6c3e5 100644 --- a/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.json +++ b/erpnext/payroll/doctype/employee_benefit_application/employee_benefit_application.json @@ -119,7 +119,7 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-05-27 22:58:31.271922", + "modified": "2020-06-22 22:58:31.271922", "modified_by": "Administrator", "module": "Payroll", "name": "Employee Benefit Application", diff --git a/erpnext/payroll/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json b/erpnext/payroll/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json index f0415d2b108..fa6b4da2af3 100644 --- a/erpnext/payroll/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json +++ b/erpnext/payroll/doctype/employee_benefit_application_detail/employee_benefit_application_detail.json @@ -45,7 +45,7 @@ ], "istable": 1, "links": [], - "modified": "2020-05-27 23:45:00.519134", + "modified": "2020-06-22 23:45:00.519134", "modified_by": "Administrator", "module": "Payroll", "name": "Employee Benefit Application Detail", diff --git a/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.json b/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.json index 7fea59fabf4..ae4c218615a 100644 --- a/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.json +++ b/erpnext/payroll/doctype/employee_benefit_claim/employee_benefit_claim.json @@ -123,7 +123,7 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-05-27 23:01:50.791676", + "modified": "2020-06-22 23:01:50.791676", "modified_by": "Administrator", "module": "Payroll", "name": "Employee Benefit Claim", diff --git a/erpnext/payroll/doctype/employee_incentive/employee_incentive.json b/erpnext/payroll/doctype/employee_incentive/employee_incentive.json index 81ff86506a2..204c9a40b1d 100644 --- a/erpnext/payroll/doctype/employee_incentive/employee_incentive.json +++ b/erpnext/payroll/doctype/employee_incentive/employee_incentive.json @@ -74,7 +74,7 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-05-27 22:42:51.209630", + "modified": "2020-06-22 22:42:51.209630", "modified_by": "Administrator", "module": "Payroll", "name": "Employee Incentive", diff --git a/erpnext/payroll/doctype/employee_other_income/employee_other_income.json b/erpnext/payroll/doctype/employee_other_income/employee_other_income.json index c5a2a73e423..14f63e4fdd9 100644 --- a/erpnext/payroll/doctype/employee_other_income/employee_other_income.json +++ b/erpnext/payroll/doctype/employee_other_income/employee_other_income.json @@ -76,7 +76,7 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-05-27 22:55:17.604688", + "modified": "2020-06-22 22:55:17.604688", "modified_by": "Administrator", "module": "Payroll", "name": "Employee Other Income", diff --git a/erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json b/erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json index c09708279a0..f2556d7d962 100644 --- a/erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json +++ b/erpnext/payroll/doctype/employee_tax_exemption_category/employee_tax_exemption_category.json @@ -26,7 +26,7 @@ } ], "links": [], - "modified": "2020-05-27 23:16:47.472910", + "modified": "2020-06-22 23:16:47.472910", "modified_by": "Administrator", "module": "Payroll", "name": "Employee Tax Exemption Category", diff --git a/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json b/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json index 5423365bdb9..de7c348bb2c 100644 --- a/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json +++ b/erpnext/payroll/doctype/employee_tax_exemption_declaration/employee_tax_exemption_declaration.json @@ -107,7 +107,7 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-05-27 22:49:43.829892", + "modified": "2020-06-22 22:49:43.829892", "modified_by": "Administrator", "module": "Payroll", "name": "Employee Tax Exemption Declaration", diff --git a/erpnext/payroll/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json b/erpnext/payroll/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json index eddaec28970..8c2f9aa370a 100644 --- a/erpnext/payroll/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json +++ b/erpnext/payroll/doctype/employee_tax_exemption_declaration_category/employee_tax_exemption_declaration_category.json @@ -48,7 +48,7 @@ ], "istable": 1, "links": [], - "modified": "2020-05-27 23:41:03.638739", + "modified": "2020-06-22 23:41:03.638739", "modified_by": "Administrator", "module": "Payroll", "name": "Employee Tax Exemption Declaration Category", diff --git a/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json index de8fa09a83b..b62b5aab0b4 100644 --- a/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json +++ b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json @@ -130,7 +130,7 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-05-27 22:53:10.412321", + "modified": "2020-06-22 22:53:10.412321", "modified_by": "Administrator", "module": "Payroll", "name": "Employee Tax Exemption Proof Submission", diff --git a/erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json index 4c53bd3f5d1..c1f532050ac 100644 --- a/erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json +++ b/erpnext/payroll/doctype/employee_tax_exemption_proof_submission_detail/employee_tax_exemption_proof_submission_detail.json @@ -53,7 +53,7 @@ ], "istable": 1, "links": [], - "modified": "2020-05-27 23:37:08.265600", + "modified": "2020-06-22 23:37:08.265600", "modified_by": "Administrator", "module": "Payroll", "name": "Employee Tax Exemption Proof Submission Detail", diff --git a/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json b/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json index b89d9c197f3..f8c4b8bcb0c 100644 --- a/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json +++ b/erpnext/payroll/doctype/employee_tax_exemption_sub_category/employee_tax_exemption_sub_category.json @@ -38,7 +38,7 @@ } ], "links": [], - "modified": "2020-05-27 23:18:08.254645", + "modified": "2020-06-22 23:18:08.254645", "modified_by": "Administrator", "module": "Payroll", "name": "Employee Tax Exemption Sub Category", diff --git a/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.json b/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.json index 72b43326c32..6337d5a6d3e 100644 --- a/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.json +++ b/erpnext/payroll/doctype/income_tax_slab/income_tax_slab.json @@ -94,7 +94,7 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-05-27 20:27:13.425084", + "modified": "2020-06-22 20:27:13.425084", "modified_by": "Administrator", "module": "Payroll", "name": "Income Tax Slab", diff --git a/erpnext/payroll/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.json b/erpnext/payroll/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.json index 2531c79828a..7f21204591a 100644 --- a/erpnext/payroll/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.json +++ b/erpnext/payroll/doctype/income_tax_slab_other_charges/income_tax_slab_other_charges.json @@ -62,7 +62,7 @@ ], "istable": 1, "links": [], - "modified": "2020-05-27 23:33:17.931912", + "modified": "2020-06-22 23:33:17.931912", "modified_by": "Administrator", "module": "Payroll", "name": "Income Tax Slab Other Charges", diff --git a/erpnext/payroll/doctype/payroll_employee_detail/payroll_employee_detail.json b/erpnext/payroll/doctype/payroll_employee_detail/payroll_employee_detail.json index b22e5de3243..bb68e1814a7 100644 --- a/erpnext/payroll/doctype/payroll_employee_detail/payroll_employee_detail.json +++ b/erpnext/payroll/doctype/payroll_employee_detail/payroll_employee_detail.json @@ -52,7 +52,7 @@ ], "istable": 1, "links": [], - "modified": "2020-05-27 23:25:13.779032", + "modified": "2020-06-22 23:25:13.779032", "modified_by": "Administrator", "module": "Payroll", "name": "Payroll Employee Detail", diff --git a/erpnext/payroll/doctype/payroll_entry/payroll_entry.json b/erpnext/payroll/doctype/payroll_entry/payroll_entry.json index 4888be29871..31a899699d7 100644 --- a/erpnext/payroll/doctype/payroll_entry/payroll_entry.json +++ b/erpnext/payroll/doctype/payroll_entry/payroll_entry.json @@ -262,7 +262,7 @@ "icon": "fa fa-cog", "is_submittable": 1, "links": [], - "modified": "2020-05-27 20:06:06.953904", + "modified": "2020-06-22 20:06:06.953904", "modified_by": "Administrator", "module": "Payroll", "name": "Payroll Entry", diff --git a/erpnext/payroll/doctype/payroll_period/payroll_period.json b/erpnext/payroll/doctype/payroll_period/payroll_period.json index 345a2415a2c..c919b4fe13b 100644 --- a/erpnext/payroll/doctype/payroll_period/payroll_period.json +++ b/erpnext/payroll/doctype/payroll_period/payroll_period.json @@ -53,7 +53,7 @@ } ], "links": [], - "modified": "2020-05-27 20:12:32.684189", + "modified": "2020-06-22 20:12:32.684189", "modified_by": "Administrator", "module": "Payroll", "name": "Payroll Period", diff --git a/erpnext/payroll/doctype/payroll_period_date/payroll_period_date.json b/erpnext/payroll/doctype/payroll_period_date/payroll_period_date.json index d745fcd5325..4a2f383b379 100644 --- a/erpnext/payroll/doctype/payroll_period_date/payroll_period_date.json +++ b/erpnext/payroll/doctype/payroll_period_date/payroll_period_date.json @@ -26,7 +26,7 @@ ], "istable": 1, "links": [], - "modified": "2020-05-27 23:30:15.943356", + "modified": "2020-06-22 23:30:15.943356", "modified_by": "Administrator", "module": "Payroll", "name": "Payroll Period Date", diff --git a/erpnext/payroll/doctype/payroll_settings/payroll_settings.json b/erpnext/payroll/doctype/payroll_settings/payroll_settings.json index e3b8b3e7e04..e14b4785ba3 100644 --- a/erpnext/payroll/doctype/payroll_settings/payroll_settings.json +++ b/erpnext/payroll/doctype/payroll_settings/payroll_settings.json @@ -109,7 +109,7 @@ "icon": "fa fa-cog", "issingle": 1, "links": [], - "modified": "2020-06-05 12:35:34.861674", + "modified": "2020-06-22 12:35:34.861674", "modified_by": "Administrator", "module": "Payroll", "name": "Payroll Settings", diff --git a/erpnext/payroll/doctype/retention_bonus/retention_bonus.json b/erpnext/payroll/doctype/retention_bonus/retention_bonus.json index 53fe17f9f66..da884c2f289 100644 --- a/erpnext/payroll/doctype/retention_bonus/retention_bonus.json +++ b/erpnext/payroll/doctype/retention_bonus/retention_bonus.json @@ -93,7 +93,7 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-05-27 22:42:05.251951", + "modified": "2020-06-22 22:42:05.251951", "modified_by": "Administrator", "module": "Payroll", "name": "Retention Bonus", diff --git a/erpnext/payroll/doctype/salary_component/salary_component.json b/erpnext/payroll/doctype/salary_component/salary_component.json index f1e5cf090dd..225b0482937 100644 --- a/erpnext/payroll/doctype/salary_component/salary_component.json +++ b/erpnext/payroll/doctype/salary_component/salary_component.json @@ -245,7 +245,7 @@ ], "icon": "fa fa-flag", "links": [], - "modified": "2020-06-01 15:39:20.826565", + "modified": "2020-06-22 15:39:20.826565", "modified_by": "Administrator", "module": "Payroll", "name": "Salary Component", diff --git a/erpnext/payroll/doctype/salary_detail/salary_detail.json b/erpnext/payroll/doctype/salary_detail/salary_detail.json index b7d2bc12725..adb54f26c6d 100644 --- a/erpnext/payroll/doctype/salary_detail/salary_detail.json +++ b/erpnext/payroll/doctype/salary_detail/salary_detail.json @@ -211,7 +211,7 @@ ], "istable": 1, "links": [], - "modified": "2020-05-27 23:21:26.300951", + "modified": "2020-06-22 23:21:26.300951", "modified_by": "Administrator", "module": "Payroll", "name": "Salary Detail", diff --git a/erpnext/payroll/doctype/salary_slip/salary_slip.json b/erpnext/payroll/doctype/salary_slip/salary_slip.json index a6337deef58..663a3ef9ea2 100644 --- a/erpnext/payroll/doctype/salary_slip/salary_slip.json +++ b/erpnext/payroll/doctype/salary_slip/salary_slip.json @@ -616,7 +616,7 @@ "idx": 9, "is_submittable": 1, "links": [], - "modified": "2020-06-05 14:42:43.921828", + "modified": "2020-06-22 14:42:43.921828", "modified_by": "Administrator", "module": "Payroll", "name": "Salary Slip", diff --git a/erpnext/payroll/doctype/salary_slip_timesheet/salary_slip_timesheet.json b/erpnext/payroll/doctype/salary_slip_timesheet/salary_slip_timesheet.json index 028c195a2fe..9930c53ec97 100644 --- a/erpnext/payroll/doctype/salary_slip_timesheet/salary_slip_timesheet.json +++ b/erpnext/payroll/doctype/salary_slip_timesheet/salary_slip_timesheet.json @@ -28,7 +28,7 @@ ], "istable": 1, "links": [], - "modified": "2020-05-27 23:27:43.463532", + "modified": "2020-06-22 23:27:43.463532", "modified_by": "Administrator", "module": "Payroll", "name": "Salary Slip Timesheet", diff --git a/erpnext/payroll/doctype/salary_structure/salary_structure.json b/erpnext/payroll/doctype/salary_structure/salary_structure.json index e710f6b72cb..5f94929f0b5 100644 --- a/erpnext/payroll/doctype/salary_structure/salary_structure.json +++ b/erpnext/payroll/doctype/salary_structure/salary_structure.json @@ -282,7 +282,7 @@ "idx": 1, "is_submittable": 1, "links": [], - "modified": "2020-06-05 17:07:26.129355", + "modified": "2020-06-22 17:07:26.129355", "modified_by": "Administrator", "module": "Payroll", "name": "Salary Structure", diff --git a/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.json b/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.json index 4f74a7fecf4..c84e034c727 100644 --- a/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.json +++ b/erpnext/payroll/doctype/salary_structure_assignment/salary_structure_assignment.json @@ -124,7 +124,7 @@ ], "is_submittable": 1, "links": [], - "modified": "2020-05-27 19:58:09.964692", + "modified": "2020-06-22 19:58:09.964692", "modified_by": "Administrator", "module": "Payroll", "name": "Salary Structure Assignment", diff --git a/erpnext/payroll/doctype/taxable_salary_slab/taxable_salary_slab.json b/erpnext/payroll/doctype/taxable_salary_slab/taxable_salary_slab.json index 277576eff97..ce9512f898f 100644 --- a/erpnext/payroll/doctype/taxable_salary_slab/taxable_salary_slab.json +++ b/erpnext/payroll/doctype/taxable_salary_slab/taxable_salary_slab.json @@ -51,7 +51,7 @@ ], "istable": 1, "links": [], - "modified": "2020-05-27 23:32:47.253106", + "modified": "2020-06-22 23:32:47.253106", "modified_by": "Administrator", "module": "Payroll", "name": "Taxable Salary Slab", From 62897d38784d91a4f4d0309f8d4c77b17c21b9e4 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Mon, 22 Jun 2020 14:54:01 +0530 Subject: [PATCH 59/66] fix: Unable to cancel employee advance --- erpnext/hr/doctype/employee_advance/employee_advance.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/hr/doctype/employee_advance/employee_advance.py b/erpnext/hr/doctype/employee_advance/employee_advance.py index a49dfcfc2a2..76195812c80 100644 --- a/erpnext/hr/doctype/employee_advance/employee_advance.py +++ b/erpnext/hr/doctype/employee_advance/employee_advance.py @@ -22,6 +22,7 @@ class EmployeeAdvance(Document): self.validate_employee_advance_account() def on_cancel(self): + self.ignore_linked_doctypes = ('GL Entry') self.set_status() def set_status(self): From 0093b3b27cad0799a358aed1a756cebb5b1efc08 Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Mon, 22 Jun 2020 17:21:01 +0530 Subject: [PATCH 60/66] fix: label (#22377) --- .../payroll/doctype/payroll_settings/payroll_settings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/payroll/doctype/payroll_settings/payroll_settings.json b/erpnext/payroll/doctype/payroll_settings/payroll_settings.json index e14b4785ba3..c47caa1227b 100644 --- a/erpnext/payroll/doctype/payroll_settings/payroll_settings.json +++ b/erpnext/payroll/doctype/payroll_settings/payroll_settings.json @@ -63,7 +63,7 @@ "description": "The fraction of daily wages to be paid for half-day attendance", "fieldname": "daily_wages_fraction_for_half_day", "fieldtype": "Float", - "label": "Daily Wages Fraction for Half Day", + "label": "Fraction of Daily Salary for Half Day", "show_days": 1, "show_seconds": 1 }, @@ -109,7 +109,7 @@ "icon": "fa fa-cog", "issingle": 1, "links": [], - "modified": "2020-06-22 12:35:34.861674", + "modified": "2020-06-22 17:00:58.408030", "modified_by": "Administrator", "module": "Payroll", "name": "Payroll Settings", From 7672166ce3ef9de1ddf13bf926ff8ebce2c65a11 Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Mon, 22 Jun 2020 17:22:05 +0530 Subject: [PATCH 61/66] fix: Wrong filter (#22375) --- .../report/salary_payments_via_ecs/salary_payments_via_ecs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py b/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py index afd5c13b32e..073bd91300e 100644 --- a/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py +++ b/erpnext/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py @@ -86,6 +86,7 @@ def get_conditions(filters): if filters.get("period"): conditions.append("month(start_date) = '%s' " % (filters["period"])) + conditions.append("year(start_date) = '%s' " % (frappe.utils.getdate().year)) return " and ".join(conditions) From be4fc1a78eff5b2d6616565cef6a3f0634f4bbde Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Mon, 22 Jun 2020 18:03:11 +0530 Subject: [PATCH 62/66] fix(UX): Notify user of expense account change in Purchase Invoice (#22193) --- .../purchase_invoice/purchase_invoice.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index aa1d5b526c8..870718c22d5 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -238,6 +238,12 @@ class PurchaseInvoice(BuyingController): not frappe.db.get_value("Purchase Order Item", item.po_detail, "delivered_by_supplier")): if self.update_stock and (not item.from_warehouse): + if for_validate and item.expense_account and item.expense_account != warehouse_account[item.warehouse]["account"]: + frappe.msgprint(_('''Row {0}: Expense Head changed to {1} because account {2} + is not linked to warehouse {3} or it is not the default inventory account'''.format( + item.idx, frappe.bold(warehouse_account[item.warehouse]["account"]), + frappe.bold(item.expense_account), frappe.bold(item.warehouse)))) + item.expense_account = warehouse_account[item.warehouse]["account"] else: # check if 'Stock Received But Not Billed' account is credited in Purchase receipt or not @@ -247,10 +253,21 @@ class PurchaseInvoice(BuyingController): (item.purchase_receipt, stock_not_billed_account)) if negative_expense_booked_in_pr: + if for_validate and item.expense_account and item.expense_account != stock_not_billed_account: + frappe.msgprint(_('''Row {0}: Expense Head changed to {1} because + expense is booked against this account in Purchase Receipt {2}'''.format( + item.idx, frappe.bold(stock_not_billed_account), frappe.bold(item.purchase_receipt)))) + item.expense_account = stock_not_billed_account else: # If no purchase receipt present then book expense in 'Stock Received But Not Billed' # This is done in cases when Purchase Invoice is created before Purchase Receipt + if for_validate and item.expense_account and item.expense_account != stock_not_billed_account: + frappe.msgprint(_('''Row {0}: Expense Head changed to {1} as no Purchase + Receipt is created against Item {2}. This is done to handle accounting for cases + when Purchase Receipt is created after Purchase Invoice'''.format( + item.idx, frappe.bold(stock_not_billed_account), frappe.bold(item.item_code)))) + item.expense_account = stock_not_billed_account elif item.is_fixed_asset and not is_cwip_accounting_enabled(asset_category): @@ -1020,7 +1037,7 @@ class PurchaseInvoice(BuyingController): # calculate totals again after applying TDS self.calculate_taxes_and_totals() - + def set_status(self, update=False, status=None, update_modified=True): if self.is_new(): if self.get('amended_from'): From 71da90034d876b8bf37be03c1332840871855ded Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Mon, 22 Jun 2020 18:27:14 +0530 Subject: [PATCH 63/66] fix: resetting lost reason in opportunity and quotation (#22378) --- erpnext/crm/doctype/opportunity/opportunity.js | 1 + erpnext/selling/doctype/quotation/quotation.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/erpnext/crm/doctype/opportunity/opportunity.js b/erpnext/crm/doctype/opportunity/opportunity.js index 0c9ba495c73..f1b81713496 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.js +++ b/erpnext/crm/doctype/opportunity/opportunity.js @@ -96,6 +96,7 @@ frappe.ui.form.on("Opportunity", { }); } else { frm.add_custom_button(__("Reopen"), function() { + frm.set_value("lost_reasons",[]) frm.set_value("status", "Open"); frm.save(); }); diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 0e771c3025a..449a968a4f9 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -99,6 +99,8 @@ class Quotation(SellingController): self.update_lead() def on_cancel(self): + if self.lost_reasons: + self.lost_reasons = [] super(Quotation, self).on_cancel() #update enquiry status From 5dc175f06851973d4d4a64cfb7885e22bbe39dc1 Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Mon, 22 Jun 2020 19:05:39 +0530 Subject: [PATCH 64/66] fix(Immutable Ledger): Item wise backdated stock entry posting (#22366) * fix(Immutable Ledger): Item wise backdated stock entry posting * fix: Remove fiscal year query * fix: Update message string --- erpnext/utilities/transaction_base.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/erpnext/utilities/transaction_base.py b/erpnext/utilities/transaction_base.py index 024aa6f31dd..2359648c95c 100644 --- a/erpnext/utilities/transaction_base.py +++ b/erpnext/utilities/transaction_base.py @@ -161,19 +161,19 @@ class TransactionBase(StatusUpdater): if not (self.get("update_stock") or self.get("is_pos")): return - fiscal_year = get_fiscal_year(self.get('posting_date'), as_dict=True).name + for item in self.get('items'): + last_transaction_time = frappe.db.sql(""" + select MAX(timestamp(posting_date, posting_time)) as posting_time + from `tabStock Ledger Entry` + where docstatus = 1 and item_code = %s """, (item.item_code))[0][0] - last_transaction_time = frappe.db.sql(""" - select MAX(timestamp(posting_date, posting_time)) as posting_time - from `tabStock Ledger Entry` - where docstatus = 1""")[0][0] + cur_doc_posting_datetime = "%s %s" % (self.posting_date, self.get("posting_time") or "00:00:00") - cur_doc_posting_datetime = "%s %s" % (self.posting_date, self.get("posting_time") or "00:00:00") - - if last_transaction_time and get_datetime(cur_doc_posting_datetime) < get_datetime(last_transaction_time): - frappe.throw(_("""Posting timestamp of current transaction - must be after last Stock transaction's timestamp which is {0}""").format(frappe.bold(last_transaction_time)), - title=_("Backdated Stock Entry")) + if last_transaction_time and get_datetime(cur_doc_posting_datetime) < get_datetime(last_transaction_time): + msg = _("Last Stock Transaction for item {0} was on {1}.").format(frappe.bold(item.item_code), frappe.bold(last_transaction_time)) + msg += "

" + _("Stock Transactions for Item {0} cannot be posted before this time.").format(frappe.bold(item.item_code)) + msg += "

" + _("Please remove this item and try to submit again or update the posting time.") + frappe.throw(msg, title=_("Backdated Stock Entry")) def delete_events(ref_type, ref_name): events = frappe.db.sql_list(""" SELECT From e3973a4730eff7becc183adede0b56d9315049a9 Mon Sep 17 00:00:00 2001 From: Poranut Chollavorn Date: Thu, 18 Jun 2020 14:41:26 +0000 Subject: [PATCH 65/66] fix(pricing_rule): apply_on logic dont get cleanup (cherry picked from commit acf399c4e0c74458c17866be7d72788aeecbe829) --- .../accounts/doctype/pricing_rule/pricing_rule.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index 4d9053a55b3..ef1f4e6999f 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -80,9 +80,15 @@ class PricingRule(Document): for f in options: if not f: continue - f = frappe.scrub(f) - if f!=fieldname: - self.set(f, None) + scrubbed_f = frappe.scrub(f) + + if logic_field == 'apply_on': + apply_on_f = apply_on_dict.get(f, f) + else: + apply_on_f = scrubbed_f + + if scrubbed_f != fieldname: + self.set(apply_on_f, None) if self.mixed_conditions and self.get("same_item"): self.same_item = 0 From aaed3b988f4fe173685bfe140c9ee0e42c379468 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 22 Jun 2020 13:44:11 +0530 Subject: [PATCH 66/66] added validation and clear fields for Apply Rule On Other (cherry picked from commit ebbbc85fc0f9aa418163f8344d3a234ecbe08488) --- .../doctype/pricing_rule/pricing_rule.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index ef1f4e6999f..ead300e3bb4 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -17,6 +17,8 @@ from six import string_types apply_on_dict = {"Item Code": "items", "Item Group": "item_groups", "Brand": "brands"} +other_fields = ["other_item_code", "other_item_group", "other_brand"] + class PricingRule(Document): def validate(self): self.validate_mandatory() @@ -47,6 +49,13 @@ class PricingRule(Document): if tocheck and not self.get(tocheck): throw(_("{0} is required").format(self.meta.get_label(tocheck)), frappe.MandatoryError) + if self.apply_rule_on_other: + o_field = 'other_' + frappe.scrub(self.apply_rule_on_other) + if not self.get(o_field) and o_field in other_fields: + frappe.throw(_("For the 'Apply Rule On Other' condition the field {0} is mandatory") + .format(frappe.bold(self.apply_rule_on_other))) + + if self.price_or_product_discount == 'Price' and not self.rate_or_discount: throw(_("Rate or Discount is required for the price discount."), frappe.MandatoryError) @@ -93,6 +102,14 @@ class PricingRule(Document): if self.mixed_conditions and self.get("same_item"): self.same_item = 0 + apply_rule_on_other = frappe.scrub(self.apply_rule_on_other or "") + + cleanup_other_fields = (other_fields if not apply_rule_on_other + else [o_field for o_field in other_fields if o_field != 'other_' + apply_rule_on_other]) + + for other_field in cleanup_other_fields: + self.set(other_field, None) + def validate_rate_or_discount(self): for field in ["Rate"]: if flt(self.get(frappe.scrub(field))) < 0: