This commit is contained in:
Mohit Panjwani
2022-02-10 11:50:13 +05:30
12 changed files with 88 additions and 52 deletions

View File

@ -92,6 +92,12 @@ class CustomerProfileRequest extends FormRequest
], ],
'shipping.fax' => [ 'shipping.fax' => [
'nullable', 'nullable',
],
'customer_avatar' => [
'nullable',
'file',
'mimes:gif,jpg,png',
'max:20000'
] ]
]; ];
} }

View File

@ -24,7 +24,7 @@ class InvoiceResource extends JsonResource
'paid_status' => $this->paid_status, 'paid_status' => $this->paid_status,
'tax_per_item' => $this->tax_per_item, 'tax_per_item' => $this->tax_per_item,
'discount_per_item' => $this->discount_per_item, 'discount_per_item' => $this->discount_per_item,
'notes' => $this->notes, 'notes' => $this->getNotes(),
'discount_type' => $this->discount_type, 'discount_type' => $this->discount_type,
'discount' => $this->discount, 'discount' => $this->discount,
'discount_val' => $this->discount_val, 'discount_val' => $this->discount_val,

View File

@ -23,7 +23,7 @@ class EstimateResource extends JsonResource
'reference_number' => $this->reference_number, 'reference_number' => $this->reference_number,
'tax_per_item' => $this->tax_per_item, 'tax_per_item' => $this->tax_per_item,
'discount_per_item' => $this->discount_per_item, 'discount_per_item' => $this->discount_per_item,
'notes' => $this->notes, 'notes' => $this->getNotes(),
'discount' => $this->discount, 'discount' => $this->discount,
'discount_type' => $this->discount_type, 'discount_type' => $this->discount_type,
'discount_val' => $this->discount_val, 'discount_val' => $this->discount_val,

View File

@ -18,7 +18,7 @@ class PaymentResource extends JsonResource
'id' => $this->id, 'id' => $this->id,
'payment_number' => $this->payment_number, 'payment_number' => $this->payment_number,
'payment_date' => $this->payment_date, 'payment_date' => $this->payment_date,
'notes' => $this->notes, 'notes' => $this->getNotes(),
'amount' => $this->amount, 'amount' => $this->amount,
'unique_hash' => $this->unique_hash, 'unique_hash' => $this->unique_hash,
'invoice_id' => $this->invoice_id, 'invoice_id' => $this->invoice_id,

View File

@ -16,7 +16,7 @@ trait GeneratesPdfTrait
if ($pdf && file_exists($pdf['path'])) { if ($pdf && file_exists($pdf['path'])) {
return response()->make(file_get_contents($pdf['path']), 200, [ return response()->make(file_get_contents($pdf['path']), 200, [
'Content-Type' => 'application/pdf', 'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="'.$pdf['file_name'].'.pdf"', 'Content-Disposition' => 'inline; filename="'.$pdf['file_name'].'"',
]); ]);
} }

View File

@ -68,6 +68,7 @@ return [
["code" => "sv", "name" => "Svenska"], ["code" => "sv", "name" => "Svenska"],
["code" => "sk", "name" => "Slovak"], ["code" => "sk", "name" => "Slovak"],
["code" => "vi", "name" => "Tiếng Việt"], ["code" => "vi", "name" => "Tiếng Việt"],
["code" => "cs", "name" => "Czech"],
["code" => "el", "name" => "Greek"], ["code" => "el", "name" => "Greek"],
["code" => "hr", "name" => "Crotian"], ["code" => "hr", "name" => "Crotian"],
], ],

View File

@ -106,6 +106,14 @@ class CurrenciesTableSeeder extends Seeder
'thousand_separator' => ',', 'thousand_separator' => ',',
'decimal_separator' => '.', 'decimal_separator' => '.',
], ],
[
'name' => 'Nepali Rupee',
'code' => 'NPR',
'symbol' => 'रू',
'precision' => '2',
'thousand_separator' => ',',
'decimal_separator' => '.',
],
[ [
'name' => 'Indian Rupee', 'name' => 'Indian Rupee',
'code' => 'INR', 'code' => 'INR',
@ -575,6 +583,15 @@ class CurrenciesTableSeeder extends Seeder
'thousand_separator' => ',', 'thousand_separator' => ',',
'decimal_separator' => '.', 'decimal_separator' => '.',
], ],
[
'name' => 'Macedonian Denar',
'code' => 'MKD',
'symbol' => 'ден',
'precision' => '0',
'thousand_separator' => '.',
'decimal_separator' => ',',
'swap_currency_symbol' => true,
],
]; ];

View File

@ -54,20 +54,24 @@ Join the Crater discord server to discuss:
- [x] Add and Use Custom Fields on Invoices & Estimates. - [x] Add and Use Custom Fields on Invoices & Estimates.
- [x] Multiple Companies - [x] Multiple Companies
- [x] Recurring Invoices - [x] Recurring Invoices
- [ ] Modules - [x] Customer Portal
- [x] Accept Payments (Stripe Integration)
- [x] White Labeling (Easy Invoice, Email & Consumer Portal Theme customisation)
- [ ] Modules API
- [ ] Blockchain Integration - [ ] Blockchain Integration
- [ ] Web 3.0 Accounting - [ ] Web 3.0 Accounting
- [ ] White Labeling (Easy Invoice, Email & Consumer Portal Theme customisation) - [ ] Vendors & Bills
- [ ] Vendors, Inventory & Bills - [ ] Inventory Management
- [ ] Payment Reminders - [ ] Payment Reminders
- [ ] Improve Accessibility - [ ] Improve Accessibility
- [ ] Customer Portal
- [ ] Accept Payments (Stripe Integration)
- [ ] Debit & Credit Notes - [ ] Debit & Credit Notes
- [ ] Time Tracking
- [ ] Full service Payroll
## Copyright ## Copyright
© 2021 Crater Invoice, Inc. © 2022 Crater Invoice, Inc.
**Special thanks to:** **Special thanks to:**

View File

@ -41,7 +41,7 @@
font-style: normal; font-style: normal;
font-weight: 600; font-weight: 600;
font-display: swap; font-display: swap;
src: url("/fonts/Poppins-Semibold.ttf") format("truetype"); src: url("/fonts/Poppins-SemiBold.ttf") format("truetype");
} }
// Default Theme // Default Theme

View File

@ -85,21 +85,21 @@
"select_state": "Sélectionnez l'état", "select_state": "Sélectionnez l'état",
"select_country": "Choisissez le pays", "select_country": "Choisissez le pays",
"select_city": "Sélectionnez une ville", "select_city": "Sélectionnez une ville",
"street_1": "Rue 1", "street_1": "Rue, voie, boite postale",
"street_2": "Rue # 2", "street_2": "Bâtiment, étage, lieu-dit, complément,...",
"action_failed": "Action : échoué", "action_failed": "Action : échoué",
"retry": "Réessayez", "retry": "Réessayez",
"choose_note": "Choisissez une note de bas de page", "choose_note": "Choisissez une note de bas de page",
"no_note_found": "Aucune note de bas de page trouvée", "no_note_found": "Aucune note de bas de page trouvée",
"insert_note": "Insérer une note", "insert_note": "Insérer une note",
"copied_pdf_url_clipboard": "L'adresse du PDF a été copiée.", "copied_pdf_url_clipboard": "L'adresse du PDF a été copiée.",
"copied_url_clipboard": "Copied url to clipboard!", "copied_url_clipboard": "URL copiée vers le presse-papier!",
"docs": "Documents", "docs": "Documents",
"do_you_wish_to_continue": "Voulez-vous continuer ?", "do_you_wish_to_continue": "Voulez-vous continuer ?",
"note": "Note de bas de page", "note": "Note de bas de page",
"pay_invoice": "Pay Invoice", "pay_invoice": "Payer facture",
"login_successfully": "Logged in successfully!", "login_successfully": "Identifié avec succès!",
"logged_out_successfully": "Logged out successfully" "logged_out_successfully": "Déconnecté avec succès"
}, },
"dashboard": { "dashboard": {
"select_year": "Sélectionnez l'année", "select_year": "Sélectionnez l'année",
@ -141,7 +141,7 @@
"name": "Nom", "name": "Nom",
"description": "Description", "description": "Description",
"percent": "Pourcentage", "percent": "Pourcentage",
"compound_tax": "Taxe empilée" "compound_tax": "Taxe composée"
}, },
"global_search": { "global_search": {
"search": "Rechercher", "search": "Rechercher",
@ -207,10 +207,10 @@
"new_customer": "Nouveau client", "new_customer": "Nouveau client",
"edit_customer": "Modifier le client", "edit_customer": "Modifier le client",
"basic_info": "Informations de base", "basic_info": "Informations de base",
"portal_access": "Portal Access", "portal_access": "Accès Portail",
"portal_access_text": "Would you like to allow this customer to login to the Customer Portal?", "portal_access_text": "Souhaitez vous autoriser ce client à se connecter au Portail Client ?",
"portal_access_url": "Customer Portal Login URL", "portal_access_url": "URL de connexion Portail Client",
"portal_access_url_help": "Please copy & forward the above given URL to your customer for providing access.", "portal_access_url_help": "Veuillez copiez et envoyez le lien ci-dessus au client pour lui fournir l'accès au portail.",
"billing_address": "Adresse de facturation", "billing_address": "Adresse de facturation",
"shipping_address": "Adresse de livraison", "shipping_address": "Adresse de livraison",
"copy_billing_address": "Copier depuis l'adresse de facturation", "copy_billing_address": "Copier depuis l'adresse de facturation",
@ -230,7 +230,7 @@
"confirm_delete": "Vous ne pourrez pas récupérer ce client et les devis, factures et paiements associés. | Vous ne serez pas en mesure de récupérer ces clients et les devis, factures et paiements associés.", "confirm_delete": "Vous ne pourrez pas récupérer ce client et les devis, factures et paiements associés. | Vous ne serez pas en mesure de récupérer ces clients et les devis, factures et paiements associés.",
"created_message": "Client créé", "created_message": "Client créé",
"updated_message": "Client mis à jour", "updated_message": "Client mis à jour",
"address_updated_message": "Address Information Updated succesfully", "address_updated_message": "Adresse mise à jour avec succès",
"deleted_message": "Client supprimé | Clients supprimés", "deleted_message": "Client supprimé | Clients supprimés",
"edit_currency_not_allowed": "Impossible de changer de devise une fois les transactions créées." "edit_currency_not_allowed": "Impossible de changer de devise une fois les transactions créées."
}, },
@ -264,8 +264,8 @@
}, },
"estimates": { "estimates": {
"title": "Devis", "title": "Devis",
"accept_estimate": "Accept Estimate", "accept_estimate": "Accepter devis",
"reject_estimate": "Reject Estimate", "reject_estimate": "Rejeter devis",
"estimate": "Devis | Devis", "estimate": "Devis | Devis",
"estimates_list": "Liste des devis", "estimates_list": "Liste des devis",
"days": "{days} jours", "days": "{days} jours",
@ -357,10 +357,10 @@
}, },
"invoices": { "invoices": {
"title": "Factures", "title": "Factures",
"download": "Download", "download": "Télécharger",
"pay_invoice": "Pay Invoice", "pay_invoice": "Payer facture",
"invoices_list": "Liste des factures", "invoices_list": "Liste des factures",
"invoice_information": "Invoice Information", "invoice_information": "Informations sur la facture",
"days": "{days} jours", "days": "{days} jours",
"months": "{months} mois", "months": "{months} mois",
"years": "{years} années", "years": "{years} années",
@ -806,7 +806,7 @@
"address_information": "Address Information" "address_information": "Address Information"
}, },
"address_information": { "address_information": {
"section_description": " You can update Your Address information using form below." "section_description": " Vous pouvez mettre à jour vos informations d'adresse via le formulaire ci dessous."
}, },
"title": "Paramètres", "title": "Paramètres",
"setting": "Paramètres | Paramètres", "setting": "Paramètres | Paramètres",
@ -1173,8 +1173,8 @@
"discount_setting": "Réglage de remise", "discount_setting": "Réglage de remise",
"discount_per_item": "Remise par article", "discount_per_item": "Remise par article",
"discount_setting_description": "Activez cette option si vous souhaitez détailler les remises par article. Par défaut, les remises sont ajoutées au sous-total.", "discount_setting_description": "Activez cette option si vous souhaitez détailler les remises par article. Par défaut, les remises sont ajoutées au sous-total.",
"expire_public_links": "Automatically Expire Public Links", "expire_public_links": "Expiration automatique des liens publics",
"expire_setting_description": "Specify whether you would like to expire all the links sent by application to view invoices, estimates & payments, etc after a specified duration.", "expire_setting_description": "Spécifiez si vous souhaitez faire expirer tous les liens publiques envoyés par l'application pour consulter les factures, devis, paiements,... après une durée spécifique.",
"save": "Enregistrer", "save": "Enregistrer",
"preference": "Préférence | Préférences", "preference": "Préférence | Préférences",
"general_settings": "Modifiez ici les paramètres globaux de Crater.", "general_settings": "Modifiez ici les paramètres globaux de Crater.",
@ -1296,16 +1296,16 @@
"invalid_disk_credentials": "Informations d'identification non valides du stockage sélectionné" "invalid_disk_credentials": "Informations d'identification non valides du stockage sélectionné"
}, },
"taxations": { "taxations": {
"add_billing_address": "Enter Billing Address", "add_billing_address": "Entrez l'adresse de facturation",
"add_shipping_address": "Enter Shipping Address", "add_shipping_address": "Entrez l'adresse de livraison",
"add_company_address": "Enter Company Address", "add_company_address": "Entrez l'adresse de la société",
"modal_description": "The information below is required in order to fetch sales tax.", "modal_description": "Les informations ci-dessous sont requises afin de récupérer les taxes de vente.",
"add_address": "Add Address for fetching sales tax.", "add_address": "Ajoutez une adresse pour récupérer les taxes de vente.",
"address_placeholder": "Example: 123, My Street", "address_placeholder": "Exemple: 123, My Street",
"city_placeholder": "Example: Los Angeles", "city_placeholder": "Exemple: Los Angeles",
"state_placeholder": "Example: CA", "state_placeholder": "Exemple: CA",
"zip_placeholder": "Example: 90024", "zip_placeholder": "Exemple: 90024",
"invalid_address": "Please provide valid address details." "invalid_address": "Veuillez fournir une adresse valide."
} }
}, },
"wizard": { "wizard": {
@ -1465,17 +1465,17 @@
"not_allowed": "Non autorisé", "not_allowed": "Non autorisé",
"login_invalid_credentials": "Ces identifiants ne correspondent pas à nos enregistrements.", "login_invalid_credentials": "Ces identifiants ne correspondent pas à nos enregistrements.",
"enter_valid_cron_format": "Veuillez entrer une tâche Cron valide", "enter_valid_cron_format": "Veuillez entrer une tâche Cron valide",
"email_could_not_be_sent": "Email could not be sent to this email address.", "email_could_not_be_sent": "L'Email n'a pas pu être envoyé vers cette adresse email.",
"invalid_address": "Please enter a valid address.", "invalid_address": "Veuillez spécifier une adresse valide.",
"invalid_key": "Please enter valid key.", "invalid_key": "Veuillez spécifier une clé valide.",
"invalid_state": "Please enter a valid state.", "invalid_state": "Veuillez spécifier un état valide.",
"invalid_city": "Please enter a valid city.", "invalid_city": "Veuillez spécifier une ville valide.",
"invalid_postal_code": "Please enter a valid zip.", "invalid_postal_code": "Veuillez spécifier un code postal valide.",
"invalid_format": "Please enter valid query string format.", "invalid_format": "Veuillez spécifier un format de requête valide.",
"api_error": "Server not responding.", "api_error": "Le serveur ne répond plus.",
"feature_not_enabled": "Feature not enabled.", "feature_not_enabled": "Fonctionnalité inactive.",
"request_limit_met": "Api request limit exceeded.", "request_limit_met": "Limite de requêtes API dépassée.",
"address_incomplete": "Incomplete Address" "address_incomplete": "Adresse incomplète"
}, },
"pdf_estimate_label": "Devis", "pdf_estimate_label": "Devis",
"pdf_estimate_number": "N°", "pdf_estimate_number": "N°",

View File

@ -1,3 +1,4 @@
import cs from './cs.json'
import en from './en.json' import en from './en.json'
import fr from './fr.json' import fr from './fr.json'
import es from './es.json' import es from './es.json'
@ -18,6 +19,7 @@ import el from './el.json'
import hr from './hr.json' import hr from './hr.json'
export default { export default {
cs,
en, en,
fr, fr,
es, es,

View File

@ -73,6 +73,12 @@ test('customer profile request validation rules', function () {
], ],
'shipping.fax' => [ 'shipping.fax' => [
'nullable', 'nullable',
],
'customer_avatar' => [
'nullable',
'file',
'mimes:gif,jpg,png',
'max:20000'
] ]
], ],
$request->rules() $request->rules()