Compare commits

...

18 Commits

Author SHA1 Message Date
Jorge Luis caudillo esparza
a3b9ffef1c AjustesNombres 2026-09-07 06:27:12 -07:00
Jorge Luis caudillo esparza
c4f958e688 -- 2026-09-02 01:08:02 -07:00
Jorge Luis caudillo esparza
547ec5d45a timbrado OK 2026-09-02 01:00:23 -07:00
Jorge Luis caudillo esparza
bb4934a031 Correccion de nmbres en español 2026-08-28 07:36:31 -07:00
Jorge Luis caudillo esparza
c6cb8d5cce -- 2026-08-28 06:36:39 -07:00
Jorge Luis caudillo esparza
e5cfa0f10c Validaciones y agregar avace 2026-08-24 05:05:53 -07:00
Jorge Luis caudillo esparza
5033fbbc06 documentos 2026-08-19 04:21:13 -07:00
Jorge Luis caudillo esparza
58af3ffece tramites 2026-08-19 03:23:04 -07:00
Jorge Luis caudillo esparza
4bea52c7ab -- 2026-08-18 18:52:00 -07:00
Jorge Luis caudillo esparza
fba8e12376 gis 5 2026-08-18 17:40:19 -07:00
Jorge Luis caudillo esparza
1c84a87f11 Gis parte 2 2026-08-18 17:20:44 -07:00
Jorge Luis caudillo esparza
3c0b18f474 Ajustesgis parte 1 2026-08-18 16:37:29 -07:00
Jorge Luis caudillo esparza
4e80ecca77 --gis 2026-08-18 11:45:00 -07:00
Jorge Luis caudillo esparza
da4af4cb2a orden etapas 2026-08-18 03:22:46 -07:00
Jorge Luis caudillo esparza
330129d24d avance y gisfail 2026-08-18 03:01:33 -07:00
Jorge Luis caudillo esparza
45ce71c7da BITACORA FEA 2026-08-14 05:43:41 -07:00
Jorge Luis caudillo esparza
8f33c860ec Ajustes 2026-08-13 19:46:33 -07:00
Jorge Luis caudillo esparza
30f2f917a4 crear usuario externo 2026-07-14 19:19:38 -07:00
508 changed files with 81464 additions and 4091 deletions

4
.gitignore vendored
View File

@@ -9,6 +9,8 @@
# Compilación .NET Framework / ASP.NET
[Bb]in/
!SIG.Web/[Bb]in/
!SIG.Web/[Bb]in/**
[Oo]bj/
[Dd]ebug/
[Rr]elease/
@@ -43,6 +45,8 @@ SIG.Web/App_Data/*.ldf
SIG.Web/App_Data/*.log
**/App_Data/log.txt
SIG.Web/App_Data/Temp/
SIG.Web/App_Data/Documentos/
SIG.Web/App_Data/Uploads/
# Herramientas y trabajo local de Codex

737
AGENTS.md
View File

@@ -45,6 +45,8 @@ Database
## Language rules
- All new code must be **C#**.
- All new project-owned identifiers and file names must use Spanish domain terminology. This includes file names, namespaces, classes, interfaces, methods, properties, fields, parameters and local variables in C#; JavaScript functions and variables; CSS hooks; HTML `data-*` attributes; and `ViewState` keys. Keep framework, library, protocol, generated-code, and established external API names unchanged.
- Do not introduce English aliases for Spanish database or business concepts. For example, use `CveUnidadMedida`, `unidadMedida`, or `data-cve-unidad-medida`, not `MeasurementUnit`, `measurementUnit`, or `data-measurement-unit-id`.
- Do not add VB.NET files.
- Do not add `.vb` files to the active project.
- Old VB files may exist only as migration reference files using `.vb.txt`.
@@ -53,652 +55,52 @@ Database
---
## Command rules
When giving commands for this project:
- Prefer **PowerShell**, **Developer PowerShell**, or **Visual Studio Package Manager Console** commands.
- Commands must be written in **one line**.
- Do not use PowerShell line continuation with backticks.
- Do not suggest `dotnet new webforms` because WebForms is not supported by the .NET CLI as an ASP.NET Core project.
- If a WebForms project must be created from command line, use Visual Studio/MSBuild-compatible project files or create the project through Visual Studio using **ASP.NET Web Application (.NET Framework)**.
- Target framework must be `.NET Framework 4.8` or `.NET Framework 4.8.1`.
Recommended project creation path:
```powershell
mkdir "C:\Proyectos\Agua de hermosillo\Plataforma de Desarrolladores"
```
```powershell
cd "C:\Proyectos\Agua de hermosillo\Plataforma de Desarrolladores"
```
Then create/open the WebForms project in Visual Studio 2022 as:
```text
ASP.NET Web Application (.NET Framework) → Web Forms → C# → .NET Framework 4.8/4.8.1
```
---
## Project folder rules
Use this base structure:
```text
SIG.Web/
AppCode/
Infrastructure/
Sql/
Repositories/
Security/
Utilities/
Contracts/
Models/
Services/
Styles/
Scripts/
Metronic/
Site.master
Site.master.cs
Login.aspx
Login.aspx.cs
Inicio.aspx
Inicio.aspx.cs
BundleConfig.cs
Global.asax
Global.asax.cs
Web.config
```
Rules:
- Do not place database access directly inside `.aspx.cs`, `.ascx.cs`, or `Site.master.cs`.
- Database-related helpers go under `App_Code/Sql` or a clearly named SQL/data folder.
- Business access goes through `Contracts` and `Services`.
- If the project file needs explicit compilation entries, include C# files recursively, for example `App_Code\**\*.cs`, but avoid duplicate compile entries that include the same file twice.
---
## Asset folder rules
The following folders are legacy visual dependencies and must be copied as complete folders:
```text
Styles/
Scripts/
Metronic/
```
Do not replace Metronic with Bootstrap-only layout.
Do not upgrade Metronic unless the user explicitly asks.
Do not remove old scripts just because they look unused; only remove references from bundles when they are not used by the master/login flow.
---
## Bundle rules
The project must implement only the bundle methods needed by the current `Site.master` and login page.
Do not bring every old bundle method from the legacy project.
Do not add unused bundle groups just because they existed before.
Do not add duplicate bundle keys.
Do not add empty bundle methods.
Allowed current bundle keys are the ones actually rendered by master/login, especially:
```text
~/bundles/modernizr
~/bundles/scripts
~/bundles/highcharts
~/Metronic/assets/global/scripts/JSV1
~/Metronic/assets/global/css/cssV1
```
WebForms/AjaxControlToolkit support bundles are allowed only when referenced by `ScriptManager` or required by WebForms controls:
```text
~/bundles/jquery
~/bundles/WebFormsJs
~/bundles/MsAjaxJs
~/Content/AjaxControlToolkit/Styles/Bundle
```
Rules:
- If `Site.master` or `Login.aspx` does not render a bundle, do not add it.
- If a bundle exists only for old pages not migrated yet, leave it out until the page needs it.
- Prefer preserving original asset paths from `Styles`, `Scripts`, and `Metronic`.
- Use `CssRewriteUrlTransform` for CSS bundles that reference fonts, images, or relative URLs.
- Do not register CSS/JS from server controls when the style/script is global; use `BundleConfig` and the master page.
---
## WebForms page rules
All normal `.aspx` pages must use `Site.master`, except the login page.
Normal pages:
- Must include `MasterPageFile="~/Site.master"`.
- Must not include `<html>`, `<head>`, `<body>`, or `<form>`.
- Must use `<asp:Content>` controls.
- Should inherit from `ClsPaginaBase` or the current C# page base class.
- Must not connect directly to SQL classes.
- Must call contracts/services for data, authentication, permissions, catalogs, menus, and user context.
Public registration exception:
- `Pages/Security/RegistroCliente.aspx`, `RegistroPendiente.aspx` and `VerificarCorreo.aspx` may be standalone public pages with their own `form runat="server"`.
- `RegistroCliente.aspx` keeps its two-step draft in encrypted ViewState and persists only after all client/company validations pass.
- All persistence continues through contracts/services/repositories and stored procedures.
Login page:
- Is the only page allowed to have its own full HTML structure.
- May inherit from `System.Web.UI.Page` or its own login base class.
- Must not inherit from `ClsPaginaBase` if that base class requires an authenticated session.
- Must use `IAuthContract` or the current auth contract.
- Must create a dummy session until real authentication is implemented.
- Must not hardcode real database login logic in `Login.aspx.cs`.
Important naming rule:
- Do not create both `Login.aspx` and `LogIn.aspx`.
- If the starter already uses `LogIn.aspx`, keep that name and keep `Web.config` consistent.
- If creating from scratch, prefer `Login.aspx`, but update `Web.config`, redirects, and links consistently.
---
## Master page rules
`Site.master` owns the main HTML structure.
Rules:
- `Site.master` owns the only main `<form runat="server">`.
- `Site.master` must keep the Metronic layout structure.
- Keep the sidebar/header/page-content structure similar to the original Metronic project.
- Do not restore the hidden search box from the old header.
- Keep the actions button if it exists in the selected master layout.
- Do not hardcode real user/menu database logic inside `Site.master.cs`.
- User data must come from a contract/service.
- Menu data must come from a contract/service.
- Breadcrumb/title/layout data must come from a contract/service when dynamic.
- Do not use `<title id="Titulo" runat="server">`.
- Prefer `<title><%: Page.Title %></title>`.
- If a generated starter currently uses a title literal, replace it with `Page.Title` unless there is a specific reason to keep the literal.
Current preferred contracts:
```text
IAuthContract
IUserSessionContract
IMenuContract
IMasterPageContract
```
If old names such as `IUserContextProvider` or `IMenuProvider` exist, migrate them to the current contract naming or create adapters. Do not keep two competing naming systems.
---
## ContentPlaceHolder rules
`Site.master` must use short placeholder IDs.
Preferred final placeholder IDs:
```text
H = page-specific head/CSS content
C = main page content
J = page-specific JavaScript
```
Example in `Site.master`:
```aspx
<asp:ContentPlaceHolder ID="H" runat="server" />
<asp:ContentPlaceHolder ID="C" runat="server" />
<asp:ContentPlaceHolder ID="J" runat="server" />
```
Example in a normal page:
```aspx
<asp:Content ID="ContentHead" ContentPlaceHolderID="H" runat="server">
</asp:Content>
<asp:Content ID="ContentMain" ContentPlaceHolderID="C" runat="server">
</asp:Content>
<asp:Content ID="ContentScripts" ContentPlaceHolderID="J" runat="server">
</asp:Content>
```
If the generated starter currently has `HeadContent`, `MainContent`, or `ScriptsContent`, rename them to `H`, `C`, and `J` before adding more pages.
Do not mix placeholder naming systems in the same project.
---
## Login and session rules
Authentication must go through a contract.
Required flow:
```text
Login.aspx.cs
↓
IAuthContract
↓
DummyAuthContract now, real AuthService later
↓
IUserSessionContract
↓
Session user
```
Initial login may be dummy.
Dummy session user should be safe and clearly fake, for example:
```text
UserId: 15
CompanyId: 1
RoleId: 1
RoleName: Administrador
CompanyName: Empresa Demo
DisplayName: Usuario Demo
```
Rules:
- Dummy login may accept any non-empty username and password during starter setup.
- Mark dummy authentication clearly in code comments.
- Do not mix real SQL authentication with dummy authentication in the same class.
- When real login is implemented, create a new service such as `SqlAuthContract` or `AuthService`.
- Do not store passwords in session.
- Do not log raw passwords.
- Use Forms Authentication if staying with classic WebForms auth.
---
## Contract rules
Contracts belong in `/Contracts`.
Current minimum contracts:
```text
Contracts/IAuthContract.cs
Contracts/IUserSessionContract.cs
Contracts/IMenuContract.cs
Contracts/IMasterPageContract.cs
```
Suggested future contracts:
```text
Contracts/IPermissionContract.cs
Contracts/INotificationContract.cs
Contracts/ICatalogSearchContract.cs
Contracts/IAuditContract.cs
Contracts/ICurrentCompanyContract.cs
```
Rules:
- Pages call contracts, not SQL classes.
- Master page calls contracts, not SQL classes.
- Login calls contracts, not SQL classes.
- Contracts must return models, DTOs, or result objects, not raw `DataTable` unless migrating legacy code.
- If legacy `DataTable` is required, isolate it behind a contract and document why.
---
## Service rules
Services belong in `/Services`.
Current starter services may include:
```text
Services/ContractRegistry.cs
Services/DummyAuthContract.cs
Services/UserSessionContract.cs
Services/DummyMenuContract.cs
Services/MasterPageContract.cs
```
Rules:
- `ContractRegistry` may be used as a simple manual dependency resolver for WebForms.
- Do not introduce a complex dependency injection framework unless required.
- Services may depend on SQL helpers/repositories.
- `.aspx.cs` files should be thin and delegate work to services.
- Keep dummy services separate from SQL-backed services.
---
## Model rules
Models belong in `/Models`.
Current starter models may include:
```text
Models/AppUser.cs
Models/LoginResult.cs
Models/MenuItemModel.cs
Models/MasterLayoutModel.cs
Models/BreadcrumbItem.cs
```
Rules:
- Use models to move data between contracts and WebForms pages.
- Do not pass anonymous objects across layers.
- Do not expose SQL connection classes or `SqlDataReader` from services to pages.
- Keep models simple and serializable when possible.
---
## Database and SQL structure rules
All database connection structure must be centralized under `App_Code/Sql` or an equivalent SQL/data folder.
Current starter SQL structure:
```text
App_Code/Sql/ConnectionNames.cs
App_Code/Sql/IConnectionStringProvider.cs
App_Code/Sql/WebConfigConnectionStringProvider.cs
App_Code/Sql/SqlConnectionFactory.cs
App_Code/Sql/SqlQueryExecutor.cs
```
Rules:
- Define connection names in one place.
- Read connection strings from `Web.config`.
- Do not hardcode connection strings in pages, master, controls, or services.
- Do not create `SqlConnection` directly in `.aspx.cs`.
- Do not create `SqlCommand` directly in `.aspx.cs`.
- Use repositories or SQL executor classes behind contracts.
- All application database reads and writes must use stored procedures; inline SQL in C# is prohibited.
- Mandatory: read and follow `AGENTS_STORED_PROCEDURES.md` for naming, output parameters, TRY/CATCH, logging, transactions, and logical deletion.
- Mandatory: read and follow `AGENTS_DATA_READER_MAPPING.md` for object, list, `DataTable`, and `JArray` result mapping.
- Mandatory: read and follow `AGENTS_DATABASE_ERROR_LOGGING.md` for safe parameter logging and reproducible stored-procedure calls.
- Mandatory: read and follow `AGENTS_PAGE_STRUCTURE.md` for the `Pages/Modulo/` location of all new WebForms pages.
- Mandatory: read and follow `AGENTS_WEBFORMS_PARTIAL_POSTBACKS.md` for the single master form, ScriptManager ownership, UpdatePanel usage, and partial-postback rules.
- Mandatory: read and follow `AGENTS_JAVASCRIPT_INITIALIZATION.md` for per-element initialization flags, global event guards, and idempotent control setup after partial postbacks.
- Keep stored procedure names centralized.
- Repositories must use `CommandType.StoredProcedure` and parameterized inputs/outputs.
- Never concatenate raw user input into SQL.
Recommended Web.config connection string pattern:
```xml
<connectionStrings>
<add name="DefaultConnection" connectionString="..." providerName="System.Data.SqlClient" />
<add name="SecurityConnection" connectionString="..." providerName="System.Data.SqlClient" />
<add name="ReportingConnection" connectionString="..." providerName="System.Data.SqlClient" />
</connectionStrings>
```
---
## Base page rules
Normal pages should inherit from a C# base page.
Preferred base class:
```text
App_Code/Infrastructure/ClsPaginaBase.cs
```
If the starter currently has `WebFormsPageBase.cs`, either:
- rename it to `ClsPaginaBase.cs`, or
- keep `WebFormsPageBase` and update this AGENTS.md/project rules consistently.
Do not keep both base classes doing the same job.
Base page responsibilities:
- Validate authenticated session.
- Expose current user from `IUserSessionContract`.
- Provide helper methods for messages, redirects, and permissions.
- Avoid database access.
- Avoid page-specific business logic.
---
## Global.asax rules
`Global.asax` / `Global.asax.cs` should:
- Register bundles through `BundleConfig.RegisterBundles(BundleTable.Bundles)`.
- Configure basic application startup.
- Avoid business logic.
- Avoid direct database startup queries unless absolutely required.
If OWIN is not used, prevent startup errors by adding this to `Web.config`:
```xml
<add key="owin:AutomaticAppStartup" value="false" />
```
Do not add OWIN packages unless the project actually needs OWIN.
---
## Web.config rules
`Web.config` must stay compatible with ASP.NET WebForms on .NET Framework 4.8/4.8.1.
Rules:
- Use Forms Authentication unless a different auth system is explicitly requested.
- Allow anonymous access only to the login page and required static assets.
- Do not add ASP.NET Core middleware settings.
- Do not add unsupported `.NET Core` config sections.
- Do not add CodeDom provider entries unless the matching NuGet package is installed.
- If this error appears: `No se pudo ubicar el tipo de proveedor CodeDom Microsoft.CodeDom.Providers.DotNetCompilerPlatform...`, either install the exact package version or remove/fix the `system.codedom` section.
- Keep MIME mappings for fonts such as `.woff` and `.woff2` when Metronic requires them.
---
## OWIN rule
If the application shows this error:
```text
No assembly found containing an OwinStartupAttribute
```
And the project does not use OWIN, add this in `appSettings`:
```xml
<add key="owin:AutomaticAppStartup" value="false" />
```
Do not create an empty OWIN startup class just to silence the error unless OWIN is actually required.
---
## Site.master rendering rules
The master page should render bundles and scripts in this general order:
Inside `<head>`:
```aspx
<%: Scripts.Render("~/bundles/modernizr") %>
<%: Styles.Render("~/Content/AjaxControlToolkit/Styles/Bundle") %>
<%: Styles.Render("~/Metronic/assets/global/css/cssV1") %>
<asp:ContentPlaceHolder ID="H" runat="server" />
```
Inside `<form>` near the top:
```aspx
<asp:ScriptManager ID="TSM" runat="server" />
<%: Scripts.Render("~/bundles/scripts") %>
```
Before closing `</form>`:
```aspx
<%: Scripts.Render("~/Metronic/assets/global/scripts/JSV1") %>
<%: Scripts.Render("~/bundles/highcharts") %>
<asp:ContentPlaceHolder ID="J" runat="server" />
```
Rules:
- Do not render the same script twice.
- Do not render JQuery twice.
- Keep `ScriptManager` if AjaxControlToolkit, UpdatePanel, or WebForms AJAX is used.
- Keep `TSM_AsyncPostBackError` only if implemented in code-behind.
- Remove or implement any event handler referenced by markup.
---
## Header/menu rules
The master header must preserve the selected Metronic layout.
Rules:
- Keep user dropdown.
- Keep logout option.
- Keep actions button when present.
- Do not restore the hidden/old search box from legacy header.
- Sidebar menu must be built from `IMenuContract`.
- Do not build the menu from SQL inside `Site.master.cs`.
- Menu items should use `MenuItemModel` or an equivalent model.
- Encode text output when generating HTML menu strings.
---
## Page title and breadcrumb rules
Page title and breadcrumb should be handled consistently.
Rules:
- Use `Page.Title` for the browser title.
- Use a master/layout model for visible page title and breadcrumb.
- Do not hardcode global breadcrumb logic in every page.
- Normal pages may set page title in `Page_Load` or via properties.
Preferred model:
```text
MasterLayoutModel
PageTitle
Breadcrumbs
CurrentUser
MenuItems
```
---
## Security rules
- Do not store passwords in code, comments, Web.config examples, or session.
- Do not expose real connection strings in committed files.
- Use dummy values in examples.
- Use parameterized SQL.
- Validate uploaded files by extension, MIME type, and size when uploads are later added.
- Avoid writing raw exception details to the user in production.
- Keep `customErrors mode="Off"` only for local development.
---
## Error handling rules
- Handle null session user cleanly and redirect to login.
- Handle failed login with a friendly message.
- Handle async postback errors through `ScriptManager.AsyncPostBackError` only if the handler exists.
- Avoid infinite loading states in JavaScript controls.
- For AJAX/server search controls, use client and server timeouts.
- Recommended default search timeout: about 20 to 30 seconds unless the user asks otherwise.
---
## JavaScript and CSS rules
- Global scripts/styles must be registered in `BundleConfig` and rendered by master.
- Page-specific scripts go in placeholder `J`.
- Page-specific CSS/head content goes in placeholder `H`.
- Do not inline large JavaScript blocks in `.aspx` unless page-specific and small.
- Do not remove existing custom legacy files unless the user asks.
- Fix null `addEventListener` errors by checking that the element exists before attaching events.
- Avoid blocking Ctrl+V unless a specific feature requires it.
---
## User control rules
If server controls are migrated:
- Prefer C# classes under `App_Code/SigControls` when creating reusable server controls.
- Do not mix WebForms `.ascx` user controls with App_Code server-control classes unless there is a clear reason.
- Do not register global CSS/JS from the control when master bundles already include them.
- Controls should expose properties/events and avoid direct SQL access.
- Controls should call contracts/services when they need data.
---
## PDF viewer migration rules
If the PDF viewer is added to this project later:
- Implement it in C#.
- Prefer `App_Code/SigControls` for server controls.
- Do not add VB files.
- Do not use `/* */` comments in VB reference files; VB references must remain `.vb.txt` only.
- Keep global PDF viewer CSS/JS references in bundles.
- Do not register duplicate resources from the control and master at the same time.
- Session or temp-folder PDF storage must be explicit and centralized.
---
## Home page rules
Use only one active home page convention.
Allowed options:
```text
Default.aspx
Inicio.aspx
```
Rules:
- Do not keep both as competing entry pages.
- If using `Inicio.aspx`, redirect `Default.aspx` to `Inicio.aspx` or update Forms Authentication default URL.
- If using `Default.aspx`, keep Web.config and menu links pointing to `Default.aspx`.
- The home page must use `Site.master`.
---
## File delivery rules for this project
When generating a single downloadable file:
- If the file is `.js` or `.css` and it is not inside a ZIP, append `.txt` to the filename.
- Example: `custom.js.txt`, `styles.css.txt`.
- If the file is inside a ZIP, keep the real extension `.js` or `.css`.
- For project-level delivery, prefer ZIP files.
---
## Source code readability rules
All generated or modified source code must be formatted for human maintenance.
- Do not compress multiple controls, HTML elements, CSS rules, SQL clauses, assignments, conditions, or statements onto one line merely to reduce file length.
- Use consistent indentation and line breaks that make nesting and control flow visible.
- Put independent C# statements on separate lines. Expand non-trivial `if`, loops, object initializers, method calls, and methods across multiple lines.
- In ASPX/HTML, place nested elements and server controls on separate indented lines. Keep attributes readable; wrap long declarations across lines.
- Format CSS with one declaration per line for page-specific styles. Format JavaScript and SQL using the same readability principle.
- Prefer clear diffs and easy future editing over compact generated output.
- The command rule requiring one-line PowerShell or terminal commands applies only to commands. It does not apply to C#, ASPX, HTML, CSS, JavaScript, SQL, XML, or configuration source.
## Agent instruction file maintenance rules
- Before modifying `AGENTS.md` or any complementary `AGENTS_*.md` file, read the existing file and apply only the smallest required addition or correction.
- Do not rewrite or replace an entire agent instruction file unless the user explicitly requests a complete rewrite.
- Preserve existing user-authored rules, terminology, capitalization, examples, and formatting outside the requested change.
- When adding a rule, first verify whether an equivalent or conflicting rule already exists and update only the relevant section.
## Mandatory authorization and change-control rules
- The agent is permanently prohibited from executing `git commit`, `git commit --amend`, creating commits through another command, or asking another agent to create a commit in this repository.
- Before modifying code, files, configuration, stored procedures, database schema, or database data, the agent must tell the user exactly which files and objects it proposes to change and what each change will do.
- The agent must wait for the user's explicit confirmation before making any modification.
- Until explicit confirmation is received, the agent may perform read-only inspection and diagnosis only.
- Authorization to inspect, diagnose, or review does not authorize implementation.
- Authorization is limited to the files and objects explicitly disclosed. If the proposed scope changes, the agent must explain the additional changes and obtain new explicit confirmation.
- Authorization to edit a SQL script does not authorize installing or executing it against a database. Database execution requires separate explicit confirmation.
- A corrective action, rollback, or attempted restoration is still a modification and also requires explicit confirmation before execution.
- The agent must never infer authorization from urgency, prior approval for a different change, or the fact that the agent caused the problem.
## Mandatory complementary instruction files
The following files are part of these instructions. Read each file whose scope applies before taking action:
- `AGENTS_ARQUITECTURA.md`: project structure, contracts, services, repositories, models, database access, and transactions.
- `AGENTS_WEBFORMS_ESTRUCTURA.md`: WebForms pages, master page, login, bundles, assets, configuration, controls, and application shell.
- `AGENTS_MANTENIMIENTO_PROYECTO.md`: commands, security, errors, feedback, grids, delivery, checklist, and project evolution.
- `AGENTS_STORED_PROCEDURES.md`: stored-procedure rules.
- `AGENTS_DATA_READER_MAPPING.md`: database-result mapping.
- `AGENTS_DATABASE_ERROR_LOGGING.md`: database error diagnostics.
- `AGENTS_PAGE_STRUCTURE.md`: page locations and structure.
- `AGENTS_WEBFORMS_PARTIAL_POSTBACKS.md`: forms, ScriptManager, UpdatePanel, and partial postbacks.
- `AGENTS_JAVASCRIPT_INITIALIZATION.md`: idempotent JavaScript initialization.
- `AGENTS_CATALOG_STRUCTURE.md`: catalog layout and behavior.
- `AGENTS_DOCUMENT_STORAGE.md`: protected document storage and retrieval.
## What not to add yet
@@ -723,46 +125,3 @@ Do not add the following until the user explicitly asks:
The starter must stay small and focused: commands, master page, login, contracts, dummy user session, bundle structure, copied assets, and centralized SQL foundation.
---
## Current implementation checklist
When modifying or regenerating the project, verify:
- [ ] Project targets .NET Framework 4.8 or 4.8.1.
- [ ] All new code is C#.
- [ ] No active `.vb` files were added.
- [ ] `Styles`, `Scripts`, and `Metronic` were copied as-is.
- [ ] `BundleConfig.cs` contains only bundles rendered by master/login or required by WebForms AJAX.
- [ ] `Site.master` owns the only main form.
- [ ] Normal pages use `Site.master`.
- [ ] Normal pages do not contain full HTML structure.
- [ ] Login is the only standalone full HTML page.
- [ ] User/session data comes from `IUserSessionContract`.
- [ ] Login uses `IAuthContract`.
- [ ] Menu comes from `IMenuContract`.
- [ ] Master layout data comes from `IMasterPageContract`.
- [ ] SQL connection helpers are centralized under `App_Code/Sql`.
- [ ] Pages do not directly instantiate SQL connections.
- [ ] Placeholder IDs are `H`, `C`, and `J`.
- [ ] No hidden old search box was restored.
- [ ] Actions button is preserved when present in the selected layout.
- [ ] `Web.config` login URL matches the actual login page filename.
- [ ] No duplicate `Login.aspx` / `LogIn.aspx` pages exist.
- [ ] No OWIN startup error exists, or OWIN automatic startup is disabled.
- [ ] No missing CodeDom provider error exists.
---
## Preferred next evolution
After the starter works, the safest growth path is:
1. Replace dummy login with SQL-backed `IAuthContract`.
2. Replace dummy menu with SQL-backed `IMenuContract`.
3. Add permission contract.
4. Add base page authorization checks.
5. Add reusable controls one by one.
6. Add catalog search and UI helpers.
7. Add PDF viewer only after the base shell is stable.
Keep every new feature behind contracts so the WebForms UI remains thin and easier to migrate later if needed.

232
AGENTS_ARQUITECTURA.md Normal file
View File

@@ -0,0 +1,232 @@
# AGENTS_ARQUITECTURA.md
These rules complement `AGENTS.md` and are mandatory whenever the task changes project structure, C# architecture, database access, repositories, services, contracts, models, or application transactions.
## Project folder rules
Use this base structure:
```text
SIG.Web/
App_Code/
Infrastructure/
Sql/
Repositories/
Security/
Utilities/
Contracts/
Models/
Services/
Styles/
Scripts/
Metronic/
Site.master
Site.master.cs
Login.aspx
Login.aspx.cs
Inicio.aspx
Inicio.aspx.cs
BundleConfig.cs
Global.asax
Global.asax.cs
Web.config
```
Rules:
- The active application uses the ASP.NET Web Site runtime-compilation model.
- Shared C# source belongs in the exact special folder `App_Code`.
- Pages, master pages, controls, handlers, and `Global.asax` use `CodeFile` or source compiled from `App_Code`; do not introduce new `CodeBehind` dependencies on `SIG.Web.dll`.
- Keep third-party and external assemblies in `bin`, but do not build or deploy a project assembly named `SIG.Web.dll`.
- Do not place database access directly inside `.aspx.cs`, `.ascx.cs`, or `Site.master.cs`.
- Database-related helpers go under `App_Code/Sql` or a clearly named SQL/data folder.
- Business access goes through `Contracts` and `Services`.
- The active Web Site does not use explicit project compilation entries; C# files under `App_Code` compile automatically at runtime.
---
## Contract rules
Contracts belong in `/Contracts`.
Current minimum contracts:
```text
Contracts/IAuthContract.cs
Contracts/IUserSessionContract.cs
Contracts/IMenuContract.cs
Contracts/IMasterPageContract.cs
```
Suggested future contracts:
```text
Contracts/IPermissionContract.cs
Contracts/INotificationContract.cs
Contracts/ICatalogSearchContract.cs
Contracts/IAuditContract.cs
Contracts/ICurrentCompanyContract.cs
```
Rules:
- Pages call contracts, not SQL classes.
- Master page calls contracts, not SQL classes.
- Login calls contracts, not SQL classes.
- Contracts must return models, DTOs, or result objects, not raw `DataTable` unless migrating legacy code.
- If legacy `DataTable` is required, isolate it behind a contract and document why.
---
## Repository ownership rules
Repository ownership is determined by the data domain and stored-procedure prefix, not by the page or feature that currently consumes the data.
- Procedures named `PA_Gral_*` belong behind contracts and repositories under `Contracts/General` and `Repositories/General`.
- General catalogs such as states, countries, municipalities, neighborhoods, and postal codes must not be placed in a security, registration, sales, or page-specific repository.
- A feature service such as public registration may orchestrate both its feature repository and `IGeneralCatalogRepository`, but it must not move general catalog access into the feature repository.
- Apply the same ownership rule to future procedure families: `PA_Sis_*` belongs to security/system infrastructure, `PA_Tra_*` to procedures, `PA_Vta_*` to sales, and so on.
## Database executor ownership rules
- `IDbExecutor`, `DbExecutor`, `StoredProcedureCommand`, `IDbCommand`, and direct stored-procedure execution may only be used inside classes under `Repositories` or repository database infrastructure.
- Services must not reference or receive `IDbExecutor`, create database commands, execute readers, or call stored procedures directly.
- A service that needs persisted data must depend on a repository contract. The concrete repository receives `IDbExecutor` and owns parameter configuration and result mapping.
- Keep the `DbExecutor` implementation under `Repositories/Database`; do not place it under `Services` or expose it publicly through `AppServices`.
---
## Service rules
Services belong in `/Services`.
Current starter services may include:
```text
Services/ContractRegistry.cs
Services/DummyAuthContract.cs
Services/UserSessionContract.cs
Services/DummyMenuContract.cs
Services/MasterPageContract.cs
```
Rules:
- `ContractRegistry` may be used as a simple manual dependency resolver for WebForms.
- Do not introduce a complex dependency injection framework unless required.
- Services may depend on SQL helpers/repositories.
- `.aspx.cs` files should be thin and delegate work to services.
- Keep dummy services separate from SQL-backed services.
- Services own application transactions when one business operation performs one or more repository mutations.
- Use `TransactionLogic` inside a `using` block around the repository calls and invoke `Commit()` only after every required repository result succeeds.
- Pages and repositories must not create, commit, roll back, or dispose application transactions.
- Repositories participate through the ambient `TransactionScope`; connection strings used for transactional work must not set `Enlist=false`.
- Select `TransactionScopeOption`, isolation level, and timeout in the service according to the business operation. Use `RequiresNew` or `Suppress` only when that behavior is intentional and documented by the call site.
- Do not include slow external operations such as SMTP or HTTP calls inside a database transaction.
---
## Model rules
Models belong in `/Models`.
Current starter models may include:
```text
Models/AppUser.cs
Models/LoginResult.cs
Models/MenuItemModel.cs
Models/MasterLayoutModel.cs
Models/BreadcrumbItem.cs
```
Rules:
- Use models to move data between contracts and WebForms pages.
- Do not pass anonymous objects across layers.
- Do not expose SQL connection classes or `SqlDataReader` from services to pages.
- Keep models simple and serializable when possible.
---
## Database and SQL structure rules
All database connection structure must be centralized under `App_Code/Sql` or an equivalent SQL/data folder.
Current starter SQL structure:
```text
App_Code/Sql/ConnectionNames.cs
App_Code/Sql/IConnectionStringProvider.cs
App_Code/Sql/WebConfigConnectionStringProvider.cs
App_Code/Sql/SqlConnectionFactory.cs
App_Code/Sql/SqlQueryExecutor.cs
```
Rules:
- Define connection names in one place.
- Read connection strings from `Web.config`.
- Do not hardcode connection strings in pages, master, controls, or services.
- Do not create `SqlConnection` directly in `.aspx.cs`.
- Do not create `SqlCommand` directly in `.aspx.cs`.
- Use repositories or SQL executor classes behind contracts.
- All application database reads and writes must use stored procedures; inline SQL in C# is prohibited.
- Access to modules and catalogs is controlled by the menu and page-access layer. Reusable catalog stored procedures must not query `Sis_Usuarios`, restrict execution by `CveRol`, or return access-denied messages for module authorization.
- Keep `@CveUsuarioEjecuta` in catalog procedures for the required signature and auditing when applicable, not to authorize access to the module.
- Do not invent or add authorization, role, user-client association, ownership, or business-prerequisite validations to any stored procedure unless the user explicitly requests that exact validation. The user prefers to add those validations manually.
- Mandatory: read and follow `AGENTS_STORED_PROCEDURES.md` for naming, output parameters, TRY/CATCH, logging, transactions, and physical deletion.
- Mandatory: read and follow `AGENTS_DATA_READER_MAPPING.md` for object, list, `DataTable`, and `JArray` result mapping.
- Mandatory: read and follow `AGENTS_DATABASE_ERROR_LOGGING.md` for safe parameter logging and reproducible stored-procedure calls.
- Mandatory: read and follow `AGENTS_PAGE_STRUCTURE.md` for the `Pages/Modulo/` location of all new WebForms pages.
- Mandatory: read and follow `AGENTS_WEBFORMS_PARTIAL_POSTBACKS.md` for the single master form, ScriptManager ownership, UpdatePanel usage, and partial-postback rules.
- Mandatory: read and follow `AGENTS_JAVASCRIPT_INITIALIZATION.md` for per-element initialization flags, global event guards, and idempotent control setup after partial postbacks.
- Mandatory: read and follow `AGENTS_CATALOG_STRUCTURE.md` for catalog titles, breadcrumbs, actions, filters, indicators, grids, quick-create modals, and detail pages.
- Mandatory: read and follow `AGENTS_DOCUMENT_STORAGE.md` for document folders, client access validation, protected file retrieval, and GIS file naming.
- Keep stored procedure names centralized.
- Repositories must use `CommandType.StoredProcedure` and parameterized inputs/outputs.
- Never concatenate raw user input into SQL.
- The database default collation and general text columns must use `Modern_Spanish_CS_AS`.
- Columns named `Codigo`, beginning with `Codigo`, or containing a real user login identifier such as `NombreUsuario`, `UsuarioPortal`, or `Acum_PortalUsuario` must use `Modern_Spanish_CI_AS`.
- `AgenteUsuario` is browser/device metadata, not a login identifier, and must use the general `Modern_Spanish_CS_AS` collation.
- Do not use `Modern_Spanish_CS_AI`.
Recommended Web.config connection string pattern:
```xml
<connectionStrings>
<add name="DefaultConnection" connectionString="..." providerName="System.Data.SqlClient" />
<add name="SecurityConnection" connectionString="..." providerName="System.Data.SqlClient" />
<add name="ReportingConnection" connectionString="..." providerName="System.Data.SqlClient" />
</connectionStrings>
```
---
## Base page rules
Normal pages should inherit from a C# base page.
Preferred base class:
```text
App_Code/Infrastructure/ClsPaginaBase.cs
```
If the starter currently has `WebFormsPageBase.cs`, either:
- rename it to `ClsPaginaBase.cs`, or
- keep `WebFormsPageBase` and update this AGENTS.md/project rules consistently.
Do not keep both base classes doing the same job.
Base page responsibilities:
- Validate authenticated session.
- Expose current user from `IUserSessionContract`.
- Provide helper methods for messages, redirects, and permissions.
- Avoid database access.
- Avoid page-specific business logic.
---

116
AGENTS_CATALOG_STRUCTURE.md Normal file
View File

@@ -0,0 +1,116 @@
# Reglas obligatorias para páginas de catálogo
Estas reglas complementan `AGENTS.md`, `AGENTS_PAGE_STRUCTURE.md`, `AGENTS_WEBFORMS_PARTIAL_POSTBACKS.md` y `AGENTS_JAVASCRIPT_INITIALIZATION.md`.
## Estructura visual
Toda página de catálogo debe organizarse, en este orden:
1. Título de la página.
2. Barra de navegación ascendente y menú de acciones.
3. Barra o control de filtros.
4. Sección opcional de cabecera con indicadores o resúmenes.
5. Grid o contenido principal.
- El título, breadcrumb y contenedor de acciones pertenecen a `Site.master`; no deben duplicarse en cada ASPX.
- La barra de navegación debe mostrar la jerarquía ascendente hasta la página actual, por ejemplo `Inicio > Desarrolladores > Fraccionamientos`.
- La master debe exponer un `ContentPlaceHolder` de acciones dentro de un `<ul>`; las páginas insertan elementos `<li>` o un `UpdatePanel` que produzca esos elementos.
- Las acciones principales del catálogo, como agregar, exportar o imprimir, deben colocarse en ese menú cuando corresponda.
## Filtros
- Los catálogos deben usar el control reutilizable de filtros activos; no construir una barra distinta en cada página.
- El control muestra los filtros aplicados y permite abrir un modal para seleccionarlos o modificarlos.
- Los combos, buscadores y demás campos de selección pertenecen al modal de filtros.
- Todo `asp:DropDownList` nuevo de una página de catálogo debe incluir la clase `select2me`, además de sus clases visuales necesarias.
- Los filtros aplicados deben describirse con texto comprensible y permitir retirarse o limpiarse.
- La búsqueda debe volver a enlazar indicadores y contenido principal con el mismo conjunto de filtros.
- El control reutilizable de filtros debe permanecer como server control de C#, conservar la imagen de chips y toolbar acordada, y exponer un evento `Consultar` para que cada página ejecute su propia búsqueda.
- Los estilos del control de filtros pertenecen a `Styles/Filtros.css` y deben registrarse en el bundle global; no duplicarlos en `Estilos2.css`, en páginas ASPX ni registrarlos desde el control.
- El control debe reconstruir sus hijos con IDs estables y conservar su estado y eventos al trabajar dentro de un `UpdatePanel`; no debe registrar scripts globales ni crear otro `ScriptManager`.
## Presentación de grids
- Todo `asp:GridView` nuevo o modificado debe declarar `GridLines="None"`.
- Su `CssClass` debe incluir la clase exacta `Widthall`.
- No usar la clase `table-bordered` en grids de catálogo o detalle.
- Se pueden conservar `table`, `table-striped` y `table-hover` cuando correspondan al diseño.
## Ordenamiento manual de catálogos
- Cuando una tabla de catálogo tenga el campo `Orden`, no mostrar ese campo en formularios, modales ni columnas del grid.
- En el alta, el procedimiento almacenado asigna `ISNULL(MAX(Orden), 0) + 1`; cuando el orden dependa de una entidad padre, calcular el máximo únicamente dentro de ese padre.
- Las modificaciones ordinarias conservan el orden existente. Si el registro cambia de padre, asignarle el siguiente orden disponible dentro del nuevo padre.
- El procedimiento de listado ordena primero por `Orden` y después por un campo descriptivo estable.
- El grid permite reordenar filas mediante arrastre y muestra únicamente un asa visual; no muestra el valor numérico de `Orden`.
- El reordenamiento usa un procedimiento almacenado dedicado, valida en servidor el registro, la referencia y su pertenencia al mismo padre, y se ejecuta mediante repositorio y servicio.
- Todo cambio de orden se registra mediante `IBitacoraService` dentro de la misma transacción de aplicación que actualiza el catálogo.
- La inicialización del arrastre debe ser idempotente y volver a ejecutarse después de postbacks parciales sin duplicar eventos.
## Indicadores y contenido
- La sección de cabecera es opcional; se usa cuando existen indicadores útiles como totales, activos, pendientes, etapas o avances.
- No agregar tarjetas decorativas sin información funcional.
- El grid o contenido principal siempre aparece después de filtros e indicadores.
- Los estados vacíos deben explicar que no existen registros para los filtros actuales.
## Mensajes originados en modales
- Los labels dentro del modal se reservan para validaciones de captura conocidas, como campos requeridos, formatos inválidos o valores que el usuario puede corregir directamente.
- Las reglas de negocio, resultados de servicios, errores técnicos, confirmaciones y mensajes de éxito deben mostrarse mediante el sistema central de alertas, aunque la acción se haya iniciado dentro del modal.
- Cuando guardar falle, el modal debe conservar los valores y permanecer abierto o volver a abrirse; la alerta debe mostrarse por encima del overlay.
- Un guardado exitoso puede cerrar el modal y mostrar un toast. Las alertas deben encolarse para no sobreponerse.
- La misma regla aplica durante postbacks completos y parciales con `UpdatePanel`.
## Navegación a páginas de detalle
- Cuando una fila abre una página de detalle, usar `asp:HyperLink` con `NavigateUrl` o un enlace HTML real.
- No usar `LinkButton`, `CommandName`, `RowCommand` ni postback únicamente para navegar al detalle.
- Los nombres de controles, métodos y variables deben identificar la entidad de la fila, por ejemplo `LnkFraccionamientoDetalle`, `cveFraccionamiento` y `fraccionamientoDetalleUrl`.
- Reservar los comandos con postback para operaciones de servidor como guardar, eliminar, activar o ejecutar una acción de negocio.
## Pestañas y estado de página
- AjaxControlToolkit debe registrarse globalmente en `Web.config` con el prefijo exacto `ajax`; no agregar directivas `<%@ Register ... %>` en cada página.
- Las pestañas de catálogos y páginas de detalle deben implementarse con `ajax:TabContainer` y `ajax:TabPanel`.
- No crear pestañas funcionales mediante `nav-tabs` de Bootstrap, paneles ocultos manualmente o navegación JavaScript independiente del ciclo de vida de WebForms.
- Las claves y modos internos que deban sobrevivir postback se conservan en propiedades tipadas de `ViewState`.
- No usar `asp:HiddenField` para estado exclusivamente del servidor. Reservarlo para valores que JavaScript necesite leer o modificar y validarlos nuevamente en el servidor.
- Los nombres de las propiedades ViewState deben describir la entidad, por ejemplo `CveFraccionamientoActual` y `CveFraccionamientoEtapaActual`.
## Alta rápida y detalle
- Antes de implementar un catálogo se debe definir si agregar y editar usarán modal, página de detalle o ambas modalidades.
- La captura rápida se realiza en modal y contiene únicamente los campos necesarios para crear el registro.
- Cuando el alta tenga modalidad básica y avanzada, el modal debe incluir un botón `Avanzado` que navegue a la página completa.
- Cuando editar requiera relaciones, historial, etapas, documentos, trámites o estados, debe abrir una página de detalle en lugar de sobrecargar el modal.
- La página de detalle puede editar la información principal y administrar sus relaciones en secciones o pestañas claramente identificadas.
- No asumir automáticamente que alta y edición usan la misma interfaz.
## Bitácora de catálogos
- Toda alta, modificación, activación, desactivación o eliminación de un catálogo debe registrarse mediante `IBitacoraService` dentro de la misma transacción de aplicación que la operación principal.
- El servicio confirma la transacción únicamente después de guardar correctamente la operación y toda su bitácora. Un fallo del encabezado, relaciones o campos revierte también la operación principal.
- No registrar consultas, búsquedas, filtros, paginación ni visualizaciones de detalle sin cambios.
- El servicio del catálogo construye el evento; el ASPX, su code-behind y los repositorios de negocio no deben registrar la bitácora directamente.
- `Bit_Bitacora` guarda el encabezado del movimiento. Cada evento debe enviar una lista genérica de relaciones formada por tabla, campo y valor; el procedimiento resuelve `CveTabla`, `CveCampo` y si el valor se almacena como número entero o texto.
- Los catálogos ligados a un cliente deben incluir una relación para la entidad afectada y otra para `Clientes.CveCliente`. Cada relación declara explícitamente `VisibleDesarrollador`.
- Las altas envían todos los campos auditables y establecen `DiscriminarCamposSinCambios = false`.
- Las modificaciones envían valor anterior y nuevo de los campos candidatos; `DiscriminarCamposSinCambios = true` es el valor predeterminado y guarda únicamente los campos que realmente cambiaron, distinguiendo correctamente entre `NULL` y texto vacío.
- Las eliminaciones registran encabezado y relaciones, pero no requieren registros en `Bit_BitacoraCampos`.
- Nunca registrar contraseñas, hashes, tokens, secretos ni otros valores sensibles en los campos de bitácora.
- Para consultar la bitácora, `SuperUsuario` y `Administrador` pueden ver todos los registros. El rol `Empresa` se considera desarrollador y sólo puede ver eventos con una relación `Clientes.CveCliente` visible que coincida con cualquiera de sus clientes activos en `Sis_UsuariosClientes`.
- Antes de liberar un catálogo nuevo, sus tablas y campos auditables deben estar registrados y activos en `Bit_Tablas` y `Bit_Campos`, junto con el script de configuración correspondiente.
## Regla actual para fraccionamientos
- `Agregar fraccionamiento` usa captura rápida en modal.
- `Editar` o `Ver detalle` navega a una página dedicada.
- El detalle muestra la información del fraccionamiento, sus etapas, los trámites asociados a cada etapa y el último estado disponible, incluyendo estados finales como cancelado o terminado cuando existan.
## Legibilidad del código
- El ASPX, C#, CSS y JavaScript del catálogo debe conservar sangría y saltos de línea legibles.
- No colocar grids, columnas, modales, controles anidados, validaciones ni varios statements C# en una sola línea.
- Los archivos deben quedar preparados para que otro programador pueda localizar y modificar una sección sin tener que reformatearla primero.
## WebForms
- Los modales permanecen dentro del único formulario de `Site.master`; ninguna página declara un formulario adicional.
- Los eventos de botones dentro de acciones o modales siguen pasando por code-behind delgado, servicios, contratos, repositorios y procedimientos almacenados.
- Después de un postback parcial, Select2 y los modales deben reinicializarse de manera idempotente según `AGENTS_JAVASCRIPT_INITIALIZATION.md`.
- No copiar VB del sistema anterior; sólo usarlo como referencia funcional y reconstruir la solución en C#.

View File

@@ -56,8 +56,18 @@ SELECT @ErrorMostrar, @ErrorTipo, @Return;
- Los mensajes `RAISERROR` de severidad 10 pueden registrarse mediante `SqlConnection.InfoMessage` sin activar esa opción.
- Si `@Return`, `@ErrorTipo` y `@ErrorMostrar` regresan sin valor, registrar que la versión instalada del PA no devolvió el contrato requerido.
## Clasificación y retención
- `@ErrorTipo = 1` representa un error técnico o funcional que requiere atención. Debe conservarse en el log técnico principal con el diagnóstico y `ReplaySql`.
- `@ErrorTipo = 2` representa una advertencia o resultado controlado, por ejemplo un código postal inexistente. No debe escribirse en el log técnico principal.
- Las advertencias controladas se registran en archivos diarios `log/controlled/controlled-AAAA-MM-DD.log`.
- Los archivos controlados conservan exactamente tres días calendario: el actual y los dos anteriores. Los más antiguos se eliminan automáticamente al escribir el siguiente evento.
- El log controlado es compacto: fecha, origen, procedimiento, URL, mensaje amigable y tipo de excepción. No incluye stack trace completo, parámetros ni `ReplaySql`.
- Un `throw` deliberadamente controlado debe usar `ControlledApplicationException`; el clasificador no debe convertir excepciones técnicas genéricas en eventos controlados.
- Si `@ErrorTipo` es `0` pero `@Return` es falso, tratarlo como incumplimiento del contrato y enviarlo al log principal.
## Alcance
- Registrar parámetros detallados sólo cuando exista un error o advertencia que requiera diagnóstico.
- Registrar parámetros detallados y `ReplaySql` únicamente para `@ErrorTipo = 1` o fallas técnicas; las advertencias controladas usan el registro compacto sin parámetros.
- No registrar cada ejecución exitosa de manera predeterminada.
- No usar el log como auditoría de operaciones exitosas; la auditoría pertenece a su propio contrato o procedimiento.

View File

@@ -0,0 +1,44 @@
# Reglas obligatorias para almacenamiento de documentos
Estas reglas complementan `AGENTS.md` y aplican a todo archivo persistido por la aplicación.
## Estructura física
La raíz de documentos de la aplicación es:
```text
Documentos/
Generales/
Clientes/
{CveCliente}/
```
- `Generales` contiene documentos que no pertenecen a un cliente específico.
- `Clientes` contiene una carpeta por `CveCliente`.
- Antes de guardar un archivo, el servicio debe asegurar la existencia de `Documentos`, `Documentos/Generales`, `Documentos/Clientes` y de la carpeta específica del cliente cuando aplique.
- No asumir que las carpetas ya existen. Usar una operación idempotente como `Directory.CreateDirectory` para crearlas cuando falten.
- La misma regla aplica a futuras subcarpetas de documentos.
## Acceso y seguridad
- Las páginas WebForms y handlers no deben construir rutas físicas ni abrir archivos de cliente por su cuenta.
- Todo guardado y obtención de archivos debe pasar por un servicio dedicado de documentos. Un handler de descarga sólo puede transmitir el archivo previamente autorizado y resuelto por ese servicio.
- Antes de construir o abrir una ruta física, el servicio debe resolver en servidor el cliente propietario a partir de la entidad de negocio y validar el acceso del usuario.
- No confiar para autorización en `CveCliente`, rutas físicas, rutas relativas ni nombres de archivo recibidos desde el navegador.
- El rol `Empresa` se considera desarrollador y sólo puede acceder a documentos de clientes activos que tenga asignados en `Sis_UsuariosClientes`.
- Los demás roles activos, incluidos `Administrador` y `SuperUsuario`, tienen acceso global a documentos, salvo que una regla funcional más restrictiva se defina explícitamente para un módulo.
- Las rutas físicas bajo `Documentos` no deben exponerse como URLs públicas. Las descargas deben pasar por un endpoint autenticado que vuelva a validar el acceso mediante el servicio.
## GIS de etapas de fraccionamiento
- El botón `Agregar GIS` carga un archivo físico con extensión `.gis`; no solicita nombre ni URL de visualización al usuario.
- El archivo se guarda en `Documentos/Clientes/{CveCliente}/`.
- El nombre se genera exclusivamente en servidor con el formato:
```text
gis-{CveFraccionamiento}-{CveFraccionamientoEtapa}.gis
```
- El usuario no puede elegir ni modificar el nombre final del archivo.
- Al reemplazar el GIS de una etapa se conserva el mismo nombre físico y se sobrescribe el archivo correspondiente.
- La obtención del GIS debe usar el servicio de documentos y nunca una URL directa al folder `Documentos`.

View File

@@ -0,0 +1,153 @@
# AGENTS_MANTENIMIENTO_PROYECTO.md
These rules complement `AGENTS.md` and are mandatory whenever the task involves commands, security, error handling, user feedback, grids, PDF migration, file delivery, verification, or project evolution.
## Command rules
When giving commands for this project:
- Prefer **PowerShell**, **Developer PowerShell**, or **Visual Studio Package Manager Console** commands.
- Commands must be written in **one line**.
- Do not use PowerShell line continuation with backticks.
- Do not suggest `dotnet new webforms` because WebForms is not supported by the .NET CLI as an ASP.NET Core project.
- If a WebForms project must be created from command line, use Visual Studio/MSBuild-compatible project files or create the project through Visual Studio using **ASP.NET Web Application (.NET Framework)**.
- Target framework must be `.NET Framework 4.8` or `.NET Framework 4.8.1`.
Recommended project creation path:
```powershell
mkdir "C:\Proyectos\Agua de hermosillo\Plataforma de Desarrolladores"
```
```powershell
cd "C:\Proyectos\Agua de hermosillo\Plataforma de Desarrolladores"
```
Then create/open the WebForms project in Visual Studio 2022 as:
```text
ASP.NET Web Application (.NET Framework) → Web Forms → C# → .NET Framework 4.8/4.8.1
```
---
## Security rules
- Do not store passwords in code, comments, Web.config examples, or session.
- Do not expose real connection strings in committed files.
- Use dummy values in examples.
- Use parameterized SQL.
- Validate uploaded files by extension, MIME type, and size when uploads are later added.
- Avoid writing raw exception details to the user in production.
- Keep `customErrors mode="Off"` only for local development.
---
## Error handling rules
Controlled outcomes and technical failures must use different logs.
- `@ErrorTipo = 1`, SQL exceptions, timeouts, contract failures, and unexpected exceptions go to the main technical log.
- `@ErrorTipo = 2` is a controlled warning. It must not be written to the main technical log.
- Controlled warnings go to daily compact files under `~/log/controlled`.
- Controlled log files retain only the current day and the previous two days. The retention is configured with `ControlledLogRetentionDays = 3`.
- Explicit controlled throws must use `ControlledApplicationException`; do not classify arbitrary `Exception` or `InvalidOperationException` instances as controlled.
- Controlled logs record date, source, procedure, URL, and friendly message, but omit full stack traces and replay SQL to remain compact.
- A controlled exception must still return a friendly result to the page and must never be presented as an unexpected application failure.
- Handle null session user cleanly and redirect to login.
- Handle failed login with a friendly message.
- Handle async postback errors through `ScriptManager.AsyncPostBackError` only if the handler exists.
- Avoid infinite loading states in JavaScript controls.
- For AJAX/server search controls, use client and server timeouts.
- Recommended default search timeout: about 20 to 30 seconds unless the user asks otherwise.
## Action availability and feedback rules
- Do not disable a button or primary action only because a business prerequisite is missing, such as an unassigned client or an empty related catalog.
- Keep the action available by default; when the user clicks it, validate the prerequisite and show a clear message explaining why the operation cannot continue and what must be done next.
- Never leave a disabled action without an immediately visible explanation.
- Before adding `Enabled="false"`, the HTML `disabled` attribute, or an equivalent disabled CSS/JavaScript state to a catalog or page action, ask the user whether disabling is acceptable or whether a message, modal, link, or other alternative should be used.
- A transient disabled state used only while a request is being processed to prevent duplicate submissions is allowed, but the action must be restored when processing finishes.
---
## Grid display rules
- Every new or modified `asp:GridView` must declare `GridLines="None"`.
- Its `CssClass` must include the exact utility class `Widthall` so the grid uses the full available width.
- Do not add `table-bordered` to a GridView. Existing visual classes such as `table`, `table-striped`, and `table-hover` may be retained when appropriate.
- Keep GridView declarations and their columns expanded and indented according to the source code readability rules.
- Detail-page navigation from a GridView or list must use `asp:HyperLink` or another real link with `NavigateUrl`; do not use `LinkButton`, `RowCommand`, or a postback only to open a detail page.
- URL-building variables and helpers must describe the row entity, for example `cveFraccionamiento`, `fraccionamientoDetalleUrl`, or `GetFraccionamientoDetalleUrl`. Avoid generic names such as `id`, `itemUrl`, or `detailUrl` when the entity is known.
---
## PDF viewer migration rules
If the PDF viewer is added to this project later:
- Implement it in C#.
- Prefer `App_Code/SigControls` for server controls.
- Do not add VB files.
- Do not use `/* */` comments in VB reference files; VB references must remain `.vb.txt` only.
- Keep global PDF viewer CSS/JS references in bundles.
- Do not register duplicate resources from the control and master at the same time.
- Session or temp-folder PDF storage must be explicit and centralized.
---
## File delivery rules for this project
When generating a single downloadable file:
- If the file is `.js` or `.css` and it is not inside a ZIP, append `.txt` to the filename.
- Example: `custom.js.txt`, `styles.css.txt`.
- If the file is inside a ZIP, keep the real extension `.js` or `.css`.
- For project-level delivery, prefer ZIP files.
---
## Current implementation checklist
When modifying or regenerating the project, verify:
- [ ] Project targets .NET Framework 4.8 or 4.8.1.
- [ ] All new code is C#.
- [ ] No active `.vb` files were added.
- [ ] `Styles`, `Scripts`, and `Metronic` were copied as-is.
- [ ] `BundleConfig.cs` contains only bundles rendered by master/login or required by WebForms AJAX.
- [ ] `Site.master` owns the only main form.
- [ ] Normal pages use `Site.master`.
- [ ] Normal pages do not contain full HTML structure.
- [ ] Login is the only standalone full HTML page.
- [ ] User/session data comes from `IUserSessionContract`.
- [ ] Login uses `IAuthContract`.
- [ ] Menu comes from `IMenuContract`.
- [ ] Master layout data comes from `IMasterPageContract`.
- [ ] SQL connection helpers are centralized under `App_Code/Sql`.
- [ ] Pages do not directly instantiate SQL connections.
- [ ] Placeholder IDs are `H`, `C`, and `J`.
- [ ] No hidden old search box was restored.
- [ ] Actions button is preserved when present in the selected layout.
- [ ] `Web.config` login URL matches the actual login page filename.
- [ ] No duplicate `Login.aspx` / `LogIn.aspx` pages exist.
- [ ] No OWIN startup error exists, or OWIN automatic startup is disabled.
- [ ] No missing CodeDom provider error exists.
---
## Preferred next evolution
After the starter works, the safest growth path is:
1. Replace dummy login with SQL-backed `IAuthContract`.
2. Replace dummy menu with SQL-backed `IMenuContract`.
3. Add permission contract.
4. Add base page authorization checks.
5. Add reusable controls one by one.
6. Add catalog search and UI helpers.
7. Add PDF viewer only after the base shell is stable.
Keep every new feature behind contracts so the WebForms UI remains thin and easier to migrate later if needed.

View File

@@ -43,21 +43,22 @@ Todos los procedimientos deben declarar:
## Control de errores
- Usar `SET NOCOUNT ON` y `TRY/CATCH` en todos los procedimientos.
- Usar `SET XACT_ABORT ON` cuando exista una mutación o transacción.
- Iniciar la transacción dentro de `TRY`, confirmar sólo después del éxito y ejecutar rollback en `CATCH` cuando `XACT_STATE() <> 0`.
- Los procedimientos no deben usar `SET XACT_ABORT ON`, `BEGIN TRANSACTION`, `COMMIT TRANSACTION`, `ROLLBACK TRANSACTION` ni modificar una transacción recibida.
- La transacción pertenece a la capa de servicio en C#, que debe usar `TransactionLogic` dentro de `using` al coordinar las llamadas a repositorios.
- El servicio llama `Commit()` solamente cuando todas las operaciones requeridas terminan correctamente. Un fallo, excepción o salida sin `Commit()` debe permitir que `Dispose()` revierta la transacción ambiental.
- Una validación fallida debe establecer los parámetros de salida y ejecutar `RETURN`; no debe continuar la mutación.
- Para validar existencia, usar normalmente `EXISTS` en lugar de `COUNT(*)`.
- En `CATCH`, generar un mensaje técnico separado con `ERROR_NUMBER()`, `ERROR_PROCEDURE()`, `ERROR_LINE()` y `ERROR_MESSAGE()` para el log.
- El mensaje técnico puede notificarse con severidad informativa para que el ejecutor lo registre, pero nunca debe mostrarse directamente al usuario.
## Borrado lógico
## Borrado físico
- Está prohibido usar `DELETE` físico en procedimientos CRUD normales.
- Para borrar: `Borrado = 1` y `FechaBorrado = SYSDATETIME()`.
- Para restaurar: `Borrado = 0` y `FechaBorrado = NULL`.
- Las consultas normales deben filtrar `Borrado = 0` en cada tabla participante, excepto cuando el caso de uso solicite expresamente registros borrados.
- La eliminación permanente sólo puede realizarse mediante el procedimiento controlado de retención y limpieza.
- Ninguna página ASPX puede llamar directamente a la limpieza física.
- La base de datos no utiliza las columnas `Borrado` ni `FechaBorrado`; no deben agregarse a tablas, modelos, consultas ni procedimientos nuevos.
- Las operaciones de eliminación deben usar `DELETE` físico dentro de un procedimiento almacenado.
- Antes de eliminar, validar las relaciones que deban conservarse. Si existen dependencias que impiden la operación, devolver una advertencia controlada con `@ErrorTipo = 2` y un mensaje claro.
- Las eliminaciones de una entidad con hijos propios deben ejecutarse en orden, desde los hijos hasta el padre. El servicio que invoque el procedimiento debe envolver la operación en una transacción de aplicación.
- No deshabilitar constraints ni eliminar información relacionada que pertenezca a otro proceso únicamente para permitir el `DELETE`.
- Las páginas ASPX continúan llamando contratos y servicios; nunca deben ejecutar `DELETE` directamente.
## Plantilla requerida
@@ -71,8 +72,6 @@ CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_RolAdd]
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@@ -84,7 +83,6 @@ BEGIN
SELECT 1
FROM dbo.Sis_Roles
WHERE NombreRol = @Rol
AND Borrado = 0
)
BEGIN
SET @ErrorMostrar = CONCAT('El rol ''', @Rol, ''' ya se encuentra registrado.');
@@ -100,9 +98,6 @@ BEGIN
SET @Return = 1;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
SET @ErrorMostrar = 'Ocurrió un error al agregar el rol; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
@@ -120,4 +115,4 @@ END;
GO
```
Cuando el procedimiento use una transacción, debe incluir `BEGIN TRANSACTION` dentro de `TRY` y `COMMIT TRANSACTION` antes de establecer `@Return = 1`.
Aunque un procedimiento ejecute varias escrituras, no debe administrar la transacción. La atomicidad se define en el servicio que coordina los repositorios.

View File

@@ -0,0 +1,415 @@
# AGENTS_WEBFORMS_ESTRUCTURA.md
These rules complement `AGENTS.md` and are mandatory whenever the task changes WebForms pages, the master page, login, session behavior, bundles, assets, configuration, controls, or the application shell.
## Asset folder rules
The following folders are legacy visual dependencies and must be copied as complete folders:
```text
Styles/
Scripts/
Metronic/
```
Do not replace Metronic with Bootstrap-only layout.
Do not upgrade Metronic unless the user explicitly asks.
Do not remove old scripts just because they look unused; only remove references from bundles when they are not used by the master/login flow.
---
## Bundle rules
The project must implement only the bundle methods needed by the current `Site.master` and login page.
Do not bring every old bundle method from the legacy project.
Do not add unused bundle groups just because they existed before.
Do not add duplicate bundle keys.
Do not add empty bundle methods.
Allowed current bundle keys are the ones actually rendered by master/login, especially:
```text
~/bundles/modernizr
~/bundles/scripts
~/bundles/highcharts
~/Metronic/assets/global/scripts/JSV1
~/Metronic/assets/global/css/cssV1
```
WebForms/AjaxControlToolkit support bundles are allowed only when referenced by `ScriptManager` or required by WebForms controls:
```text
~/bundles/jquery
~/bundles/WebFormsJs
~/bundles/MsAjaxJs
~/Content/AjaxControlToolkit/Styles/Bundle
```
Rules:
- If `Site.master` or `Login.aspx` does not render a bundle, do not add it.
- If a bundle exists only for old pages not migrated yet, leave it out until the page needs it.
- Prefer preserving original asset paths from `Styles`, `Scripts`, and `Metronic`.
- Use `CssRewriteUrlTransform` for CSS bundles that reference fonts, images, or relative URLs.
- Do not register CSS/JS from server controls when the style/script is global; use `BundleConfig` and the master page.
---
## WebForms page rules
All normal `.aspx` pages must use `Site.master`, except the login page.
Normal pages:
- Must include `MasterPageFile="~/Site.master"`.
- Must not include `<html>`, `<head>`, `<body>`, or `<form>`.
- Must use `<asp:Content>` controls.
- Should inherit from `ClsPaginaBase` or the current C# page base class.
- Must not connect directly to SQL classes.
- Must call contracts/services for data, authentication, permissions, catalogs, menus, and user context.
Public registration exception:
- `Pages/Security/RegistroCliente.aspx`, `RegistroPendiente.aspx` and `VerificarCorreo.aspx` may be standalone public pages with their own `form runat="server"`.
- `RegistroCliente.aspx` keeps its two-step draft in encrypted ViewState and persists only after all client/company validations pass.
- All persistence continues through contracts/services/repositories and stored procedures.
Login page:
- Is the only page allowed to have its own full HTML structure.
- May inherit from `System.Web.UI.Page` or its own login base class.
- Must not inherit from `ClsPaginaBase` if that base class requires an authenticated session.
- Must use `IAuthContract` or the current auth contract.
- Must create a dummy session until real authentication is implemented.
- Must not hardcode real database login logic in `Login.aspx.cs`.
Important naming rule:
- Do not create both `Login.aspx` and `LogIn.aspx`.
- If the starter already uses `LogIn.aspx`, keep that name and keep `Web.config` consistent.
- If creating from scratch, prefer `Login.aspx`, but update `Web.config`, redirects, and links consistently.
---
## Master page rules
`Site.master` owns the main HTML structure.
Rules:
- `Site.master` owns the only main `<form runat="server">`.
- `Site.master` must keep the Metronic layout structure.
- Keep the sidebar/header/page-content structure similar to the original Metronic project.
- Do not restore the hidden search box from the old header.
- Keep the actions button if it exists in the selected master layout.
- Do not hardcode real user/menu database logic inside `Site.master.cs`.
- User data must come from a contract/service.
- Menu data must come from a contract/service.
- Breadcrumb/title/layout data must come from a contract/service when dynamic.
- Do not use `<title id="Titulo" runat="server">`.
- Prefer `<title><%: Page.Title %></title>`.
- If a generated starter currently uses a title literal, replace it with `Page.Title` unless there is a specific reason to keep the literal.
Current preferred contracts:
```text
IAuthContract
IUserSessionContract
IMenuContract
IMasterPageContract
```
If old names such as `IUserContextProvider` or `IMenuProvider` exist, migrate them to the current contract naming or create adapters. Do not keep two competing naming systems.
---
## ContentPlaceHolder rules
`Site.master` must use short placeholder IDs.
Preferred final placeholder IDs:
```text
H = page-specific head/CSS content
C = main page content
J = page-specific JavaScript
```
Example in `Site.master`:
```aspx
<asp:ContentPlaceHolder ID="H" runat="server" />
<asp:ContentPlaceHolder ID="C" runat="server" />
<asp:ContentPlaceHolder ID="J" runat="server" />
```
Example in a normal page:
```aspx
<asp:Content ID="ContentHead" ContentPlaceHolderID="H" runat="server">
</asp:Content>
<asp:Content ID="ContentMain" ContentPlaceHolderID="C" runat="server">
</asp:Content>
<asp:Content ID="ContentScripts" ContentPlaceHolderID="J" runat="server">
</asp:Content>
```
If the generated starter currently has `HeadContent`, `MainContent`, or `ScriptsContent`, rename them to `H`, `C`, and `J` before adding more pages.
Do not mix placeholder naming systems in the same project.
---
## WebForms tab and page-state rules
- Register AjaxControlToolkit once in `Web.config` under `system.web/pages/controls` with the exact prefix `ajax`; do not add `<%@ Register ... %>` directives for it in individual pages.
- AjaxControlToolkit controls must use the `ajax:` prefix, for example `ajax:TabContainer` and `ajax:TabPanel`; do not use `ajaxToolkit:` or another page-specific prefix.
- Tabs in WebForms pages must use `ajax:TabContainer` and `ajax:TabPanel`; do not build page tabs with Bootstrap `nav-tabs`, custom hidden panels, or JavaScript-only tab switching.
- Use the `ScriptManager` owned by `Site.master` and the existing AjaxControlToolkit resources. Do not add another `ScriptManager` or duplicate Toolkit scripts/styles.
- Server-side page state such as current entity keys, selected child keys, editing mode, flags, and the active tab must be stored in typed `ViewState` properties when it must survive postback.
- Do not add `asp:HiddenField` merely to preserve server-side state across postbacks. A hidden field is allowed only when client-side JavaScript must read or change the value.
- Hidden-field values are client-controlled and must never be trusted for authorization or sensitive decisions; validate them again on the server when their use is unavoidable.
- Keep ViewState values small and serializable. Do not store database connections, commands, readers, services, repositories, or unnecessarily large result sets in ViewState.
- ViewState property and key names must identify the entity and purpose, for example `CveFraccionamientoActual` and `CveFraccionamientoEtapaActual`.
- When a postback needs to recover related values from an already loaded catalog, store the typed serializable object list in a typed `ViewState` property and locate the selected object by its key.
- Do not copy server-owned catalog or model values into HTML `data-*` attributes, CSS classes, hidden fields, or other client-controlled markup merely to recover them during a postback. Read them from the typed object list stored in `ViewState`.
---
## Login and session rules
Authentication must go through a contract.
Required flow:
```text
Login.aspx.cs
↓
IAuthContract
↓
DummyAuthContract now, real AuthService later
↓
IUserSessionContract
↓
Session user
```
Initial login may be dummy.
Dummy session user should be safe and clearly fake, for example:
```text
UserId: 15
CompanyId: 1
RoleId: 1
RoleName: Administrador
CompanyName: Empresa Demo
DisplayName: Usuario Demo
```
Rules:
- Dummy login may accept any non-empty username and password during starter setup.
- Mark dummy authentication clearly in code comments.
- Do not mix real SQL authentication with dummy authentication in the same class.
- When real login is implemented, create a new service such as `SqlAuthContract` or `AuthService`.
- Do not store passwords in session.
- Do not log raw passwords.
- Use Forms Authentication if staying with classic WebForms auth.
---
## Global.asax rules
`Global.asax` / `Global.asax.cs` should:
- Register bundles through `BundleConfig.RegisterBundles(BundleTable.Bundles)`.
- Configure basic application startup.
- Avoid business logic.
- Avoid direct database startup queries unless absolutely required.
If OWIN is not used, prevent startup errors by adding this to `Web.config`:
```xml
<add key="owin:AutomaticAppStartup" value="false" />
```
Do not add OWIN packages unless the project actually needs OWIN.
---
## Web.config rules
`Web.config` must stay compatible with ASP.NET WebForms on .NET Framework 4.8/4.8.1.
Rules:
- Use Forms Authentication unless a different auth system is explicitly requested.
- Allow anonymous access only to the login page and required static assets.
- Do not add ASP.NET Core middleware settings.
- Do not add unsupported `.NET Core` config sections.
- Do not add CodeDom provider entries unless the matching NuGet package is installed.
- If this error appears: `No se pudo ubicar el tipo de proveedor CodeDom Microsoft.CodeDom.Providers.DotNetCompilerPlatform...`, either install the exact package version or remove/fix the `system.codedom` section.
- Keep MIME mappings for fonts such as `.woff` and `.woff2` when Metronic requires them.
---
## OWIN rule
If the application shows this error:
```text
No assembly found containing an OwinStartupAttribute
```
And the project does not use OWIN, add this in `appSettings`:
```xml
<add key="owin:AutomaticAppStartup" value="false" />
```
Do not create an empty OWIN startup class just to silence the error unless OWIN is actually required.
---
## Site.master rendering rules
The master page should render bundles and scripts in this general order:
Inside `<head>`:
```aspx
<%: Scripts.Render("~/bundles/modernizr") %>
<%: Styles.Render("~/Content/AjaxControlToolkit/Styles/Bundle") %>
<%: Styles.Render("~/Metronic/assets/global/css/cssV1") %>
<asp:ContentPlaceHolder ID="H" runat="server" />
```
Inside `<form>` near the top:
```aspx
<asp:ScriptManager ID="TSM" runat="server" />
<%: Scripts.Render("~/bundles/scripts") %>
```
Before closing `</form>`:
```aspx
<%: Scripts.Render("~/Metronic/assets/global/scripts/JSV1") %>
<%: Scripts.Render("~/bundles/highcharts") %>
<asp:ContentPlaceHolder ID="J" runat="server" />
```
Rules:
- Do not render the same script twice.
- Do not render JQuery twice.
- Keep `ScriptManager` if AjaxControlToolkit, UpdatePanel, or WebForms AJAX is used.
- Keep `TSM_AsyncPostBackError` only if implemented in code-behind.
- Remove or implement any event handler referenced by markup.
---
## Header/menu rules
The master header must preserve the selected Metronic layout.
Rules:
- Keep user dropdown.
- Keep logout option.
- Keep actions button when present.
- Do not restore the hidden/old search box from legacy header.
- Sidebar menu must be built from `IMenuContract`.
- Do not build the menu from SQL inside `Site.master.cs`.
- Menu items should use `MenuItemModel` or an equivalent model.
- Encode text output when generating HTML menu strings.
- Module visibility and page access are separate concerns: `Sis_Modulos.Visible` controls whether an item is shown in the menu, but it must not deny direct page access.
- `PA_Sis_PaginaAccessCheck` must validate role assignment, `PuedeVer`, active state, and URL. It must not require `Sis_Modulos.Visible = 1`.
---
## Page title and breadcrumb rules
Page title and breadcrumb should be handled consistently.
Rules:
- Use `Page.Title` for the browser title.
- Use a master/layout model for visible page title and breadcrumb.
- Do not hardcode global breadcrumb logic in every page.
- Normal pages may set page title in `Page_Load` or via properties.
Preferred model:
```text
MasterLayoutModel
PageTitle
Breadcrumbs
CurrentUser
MenuItems
```
---
## JavaScript and CSS rules
- Global scripts/styles must be registered in `BundleConfig` and rendered by master.
- Page-specific scripts go in placeholder `J`.
- Page-specific CSS/head content goes in placeholder `H`.
- Do not inline large JavaScript blocks in `.aspx` unless page-specific and small.
- Do not remove existing custom legacy files unless the user asks.
- Fix null `addEventListener` errors by checking that the element exists before attaching events.
- Avoid blocking Ctrl+V unless a specific feature requires it.
---
## User control rules
If server controls are migrated:
- Prefer C# classes under `App_Code/SigControls` when creating reusable server controls.
- Do not mix WebForms `.ascx` user controls with App_Code server-control classes unless there is a clear reason.
- Do not register global CSS/JS from the control when master bundles already include them.
- Controls should expose properties/events and avoid direct SQL access.
- Controls should call contracts/services when they need data.
---
## Home page rules
Use only one active home page convention.
For local development, the canonical home URL is:
```text
http://localhost:52706/Inicio.aspx
```
The application root must be equivalent and redirect explicitly to that page:
```text
http://localhost:52706/ -> http://localhost:52706/Inicio.aspx
```
Keep the root redirect and the `Inicio.aspx` default document consistent. Do not introduce another startup page.
Allowed options:
```text
Default.aspx
Inicio.aspx
```
Rules:
- Do not keep both as competing entry pages.
- If using `Inicio.aspx`, redirect `Default.aspx` to `Inicio.aspx` or update Forms Authentication default URL.
- If using `Default.aspx`, keep Web.config and menu links pointing to `Default.aspx`.
- The home page must use `Site.master`.
---

BIN
AGUAHH.zip Normal file

Binary file not shown.

Binary file not shown.

1708
Bitacora_Procedimientos.sql Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,573 @@
SET NOCOUNT ON;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ProductoServicioList
@Texto varchar(200) = NULL,
@IncluirInactivos bit = 0,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SET @Texto = NULLIF(LTRIM(RTRIM(@Texto)), '');
SELECT
PS.CvePS,
PS.Codigo,
PS.PS,
PS.CveTipoPS,
CASE PS.CveTipoPS
WHEN 2 THEN 'Producto'
ELSE 'Servicio'
END AS TipoPS,
PS.CveClasificacion,
C.Clasificacion,
PS.CveUnidadMedida,
UM.UnidadMedida,
CONVERT(decimal(18, 2), PS.Precio) AS Precio,
PS.Estado AS EsActivo
FROM dbo.ProductosServicios AS PS
INNER JOIN dbo.Clasificaciones AS C
ON C.CveClasificacion = PS.CveClasificacion
INNER JOIN dbo.UnidadesMedida AS UM
ON UM.CveUnidadMedida = PS.CveUnidadMedida
WHERE (@IncluirInactivos = 1 OR PS.Estado = 1)
AND
(
@Texto IS NULL
OR PS.Codigo LIKE '%' + @Texto + '%'
OR PS.PS LIKE '%' + @Texto + '%'
OR C.Clasificacion LIKE '%' + @Texto + '%'
OR UM.UnidadMedida LIKE '%' + @Texto + '%'
)
ORDER BY PS.PS, PS.CvePS;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar los productos y servicios; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ProductoServicioList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ProductoServicioGet
@CvePS int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SELECT
PS.CvePS,
PS.Codigo,
PS.PS,
PS.CveTipoPS,
CASE PS.CveTipoPS
WHEN 2 THEN 'Producto'
ELSE 'Servicio'
END AS TipoPS,
PS.CveClasificacion,
C.Clasificacion,
PS.CveUnidadMedida,
UM.UnidadMedida,
CONVERT(decimal(18, 2), PS.Precio) AS Precio,
PS.Estado AS EsActivo
FROM dbo.ProductosServicios AS PS
INNER JOIN dbo.Clasificaciones AS C
ON C.CveClasificacion = PS.CveClasificacion
INNER JOIN dbo.UnidadesMedida AS UM
ON UM.CveUnidadMedida = PS.CveUnidadMedida
WHERE PS.CvePS = @CvePS;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar el producto o servicio; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ProductoServicioGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ProductoServicioOpcionesList
@CveClasificacionActual int = NULL,
@CveUnidadMedidaActual int = NULL,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SELECT
CveClasificacion,
CASE
WHEN NULLIF(LTRIM(RTRIM(Codigo)), '') IS NULL
THEN Clasificacion COLLATE Modern_Spanish_CS_AS
ELSE
Codigo COLLATE Modern_Spanish_CS_AS
+ ' - '
+ Clasificacion COLLATE Modern_Spanish_CS_AS
END AS Clasificacion
FROM dbo.Clasificaciones
WHERE
(
Estado = 1
AND Afectable = 1
)
OR CveClasificacion = @CveClasificacionActual
ORDER BY Clasificacion, Codigo, CveClasificacion;
SELECT
CveUnidadMedida,
CASE
WHEN NULLIF(LTRIM(RTRIM(Abreviatura)), '') IS NULL
THEN UnidadMedida COLLATE Modern_Spanish_CS_AS
ELSE
UnidadMedida COLLATE Modern_Spanish_CS_AS
+ ' ('
+ Abreviatura COLLATE Modern_Spanish_CS_AS
+ ')'
END AS UnidadMedida
FROM dbo.UnidadesMedida
WHERE Estado = 1
OR CveUnidadMedida = @CveUnidadMedidaActual
ORDER BY UnidadMedida, CveUnidadMedida;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar las opciones del catálogo; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ProductoServicioOpcionesList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ProductoServicioSave
@CvePS int = NULL,
@Codigo varchar(50) = NULL,
@PS varchar(846),
@CveTipoPS int,
@CveClasificacion int,
@CveUnidadMedida int,
@Precio decimal(18, 2),
@EsActivo bit,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SELECT
@CvePS = NULLIF(@CvePS, 0),
@Codigo = NULLIF(LTRIM(RTRIM(@Codigo)), ''),
@PS = LTRIM(RTRIM(@PS));
IF NULLIF(@PS, '') IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Capture la descripción del producto o servicio.',
@ErrorTipo = 2;
RETURN;
END;
IF @CveTipoPS NOT IN (1, 2)
BEGIN
SELECT
@ErrorMostrar = 'Seleccione si el registro es producto o servicio.',
@ErrorTipo = 2;
RETURN;
END;
IF @Precio < 0
BEGIN
SELECT
@ErrorMostrar = 'El precio no puede ser negativo.',
@ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Clasificaciones
WHERE CveClasificacion = @CveClasificacion
AND
(
Estado = 1
OR CveClasificacion =
(
SELECT CveClasificacion
FROM dbo.ProductosServicios
WHERE CvePS = @CvePS
)
)
)
BEGIN
SELECT
@ErrorMostrar = 'Seleccione una clasificación vigente.',
@ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.UnidadesMedida
WHERE CveUnidadMedida = @CveUnidadMedida
AND
(
Estado = 1
OR CveUnidadMedida =
(
SELECT CveUnidadMedida
FROM dbo.ProductosServicios
WHERE CvePS = @CvePS
)
)
)
BEGIN
SELECT
@ErrorMostrar = 'Seleccione una unidad de medida vigente.',
@ErrorTipo = 2;
RETURN;
END;
IF @Codigo IS NOT NULL
AND EXISTS
(
SELECT 1
FROM dbo.ProductosServicios
WHERE Codigo = @Codigo
AND CvePS <> ISNULL(@CvePS, 0)
)
BEGIN
SELECT
@ErrorMostrar = 'El código ya está asignado a otro producto o servicio.',
@ErrorTipo = 2;
RETURN;
END;
IF @CvePS IS NULL
BEGIN
INSERT dbo.ProductosServicios
(
CveClasificacion,
CveUnidadMedida,
Codigo,
PS,
Precio,
Estado,
Fecha,
CveTipoPS,
CveUsuario,
CveUsuarioModifico,
FechaUltimaModificacion
)
VALUES
(
@CveClasificacion,
@CveUnidadMedida,
@Codigo,
@PS,
CONVERT(float, @Precio),
@EsActivo,
GETDATE(),
@CveTipoPS,
@CveUsuarioEjecuta,
@CveUsuarioEjecuta,
GETDATE()
);
SET @CvePS = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
IF NOT EXISTS
(
SELECT 1
FROM dbo.ProductosServicios
WHERE CvePS = @CvePS
)
BEGIN
SELECT
@ErrorMostrar = 'El producto o servicio seleccionado no existe.',
@ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.ProductosServicios
SET CveClasificacion = @CveClasificacion,
CveUnidadMedida = @CveUnidadMedida,
Codigo = @Codigo,
PS = @PS,
Precio = CONVERT(float, @Precio),
Estado = @EsActivo,
CveTipoPS = @CveTipoPS,
CveUsuarioModifico = @CveUsuarioEjecuta,
FechaUltimaModificacion = GETDATE()
WHERE CvePS = @CvePS;
END;
SELECT @CvePS AS CvePS;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al guardar el producto o servicio; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ProductoServicioSave'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ProductoServicioDelete
@CvePS int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.ProductosServicios
WHERE CvePS = @CvePS
)
BEGIN
SELECT
@ErrorMostrar = 'El producto o servicio seleccionado no existe.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Tra_CostosTramite
WHERE CvePS = @CvePS
)
OR EXISTS
(
SELECT 1
FROM dbo.Tra_PagosDetalle
WHERE CvePS = @CvePS
)
OR EXISTS
(
SELECT 1
FROM dbo.VentasDetalle
WHERE CvePS = @CvePS
)
OR EXISTS
(
SELECT 1
FROM dbo.ProductosServicios
WHERE CvePS <> @CvePS
AND
(
CvePSAdicional = @CvePS
OR CveCompuesto = @CvePS
)
)
BEGIN
SELECT
@ErrorMostrar = 'El producto o servicio tiene trámites, pagos, ventas o productos relacionados y no puede eliminarse.',
@ErrorTipo = 2;
RETURN;
END;
DELETE dbo.ProductosServicios
WHERE CvePS = @CvePS;
SET @Return = 1;
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 547
BEGIN
SELECT
@ErrorMostrar = 'El producto o servicio tiene información relacionada y no puede eliminarse.',
@ErrorTipo = 2,
@Return = 0;
RETURN;
END;
SELECT
@ErrorMostrar = 'Ocurrió un error al eliminar el producto o servicio; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ProductoServicioDelete'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
DECLARE @CveTabla int;
SELECT @CveTabla = CveTabla
FROM dbo.Bit_Tablas
WHERE NombreTablaSQL = 'ProductosServicios' COLLATE Modern_Spanish_CS_AS;
IF @CveTabla IS NULL
BEGIN
INSERT dbo.Bit_Tablas
(
NombreTablaSQL,
NombreMostrar,
Descripcion,
NombreCampoLlaveSQL,
Activo
)
VALUES
(
'ProductosServicios',
'Productos y servicios',
'Catálogo de productos y servicios.',
'CvePS',
1
);
SET @CveTabla = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
UPDATE dbo.Bit_Tablas
SET NombreMostrar = 'Productos y servicios',
Descripcion = 'Catálogo de productos y servicios.',
NombreCampoLlaveSQL = 'CvePS',
Activo = 1,
FechaMod = GETDATE()
WHERE CveTabla = @CveTabla;
END;
DECLARE @Campos TABLE
(
NombreCampoSQL varchar(128) COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreMostrar varchar(150) COLLATE Modern_Spanish_CS_AS NOT NULL,
MostrarEnBitacora bit NOT NULL
);
INSERT INTO @Campos
(NombreCampoSQL, NombreMostrar, MostrarEnBitacora)
VALUES
('CvePS', 'Clave', 0),
('Codigo', 'Código', 1),
('PS', 'Descripción', 1),
('CveTipoPS', 'Tipo', 1),
('CveClasificacion', 'Clasificación', 1),
('CveUnidadMedida', 'Unidad de medida', 1),
('Precio', 'Precio', 1),
('Estado', 'Activo', 1);
UPDATE BC
SET NombreMostrar = C.NombreMostrar,
MostrarEnBitacora = C.MostrarEnBitacora,
TipoDatoSQL = TY.name COLLATE Modern_Spanish_CS_AS,
Activo = 1,
FechaMod = GETDATE()
FROM dbo.Bit_Campos AS BC
INNER JOIN @Campos AS C
ON C.NombreCampoSQL = BC.NombreCampoSQL
INNER JOIN sys.columns AS SC
ON SC.object_id = OBJECT_ID(N'dbo.ProductosServicios')
AND SC.name COLLATE Modern_Spanish_CS_AS = C.NombreCampoSQL
INNER JOIN sys.types AS TY
ON TY.user_type_id = SC.user_type_id
WHERE BC.CveTabla = @CveTabla;
INSERT dbo.Bit_Campos
(
CveTabla,
NombreCampoSQL,
NombreMostrar,
MostrarEnBitacora,
TipoDatoSQL,
Activo
)
SELECT
@CveTabla,
C.NombreCampoSQL,
C.NombreMostrar,
C.MostrarEnBitacora,
TY.name COLLATE Modern_Spanish_CS_AS,
1
FROM @Campos AS C
INNER JOIN sys.columns AS SC
ON SC.object_id = OBJECT_ID(N'dbo.ProductosServicios')
AND SC.name COLLATE Modern_Spanish_CS_AS = C.NombreCampoSQL
INNER JOIN sys.types AS TY
ON TY.user_type_id = SC.user_type_id
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Bit_Campos AS BC
WHERE BC.CveTabla = @CveTabla
AND BC.NombreCampoSQL = C.NombreCampoSQL
);
GO

View File

@@ -0,0 +1,674 @@
SET NOCOUNT ON;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ClasificacionList
@Texto varchar(200) = NULL,
@IncluirInactivos bit = 0,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
SET @Texto = NULLIF(LTRIM(RTRIM(@Texto)), '');
SELECT
CveClasificacion,
Codigo,
Clasificacion,
Afectable,
Estado AS EsActivo
FROM dbo.Clasificaciones
WHERE (@IncluirInactivos = 1 OR Estado = 1)
AND
(
@Texto IS NULL
OR Codigo LIKE '%' + @Texto + '%'
OR Clasificacion LIKE '%' + @Texto + '%'
)
ORDER BY Clasificacion, Codigo, CveClasificacion;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar las clasificaciones; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ClasificacionList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ClasificacionGet
@CveClasificacion int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
SELECT
CveClasificacion,
Codigo,
Clasificacion,
Afectable,
Estado AS EsActivo
FROM dbo.Clasificaciones
WHERE CveClasificacion = @CveClasificacion;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar la clasificación; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ClasificacionGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ClasificacionSave
@CveClasificacion int = NULL,
@Codigo varchar(20) = NULL,
@Clasificacion varchar(200),
@Afectable bit,
@EsActivo bit,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
SELECT
@CveClasificacion = NULLIF(@CveClasificacion, 0),
@Codigo = NULLIF(LTRIM(RTRIM(@Codigo)), ''),
@Clasificacion = LTRIM(RTRIM(@Clasificacion));
IF NULLIF(@Clasificacion, '') IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Capture la clasificación.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Clasificaciones
WHERE Clasificacion = @Clasificacion
AND CveClasificacion <> ISNULL(@CveClasificacion, 0)
)
BEGIN
SELECT
@ErrorMostrar = 'Ya existe una clasificación con ese nombre.',
@ErrorTipo = 2;
RETURN;
END;
IF @Codigo IS NOT NULL
AND EXISTS
(
SELECT 1
FROM dbo.Clasificaciones
WHERE Codigo = @Codigo
AND CveClasificacion <> ISNULL(@CveClasificacion, 0)
)
BEGIN
SELECT
@ErrorMostrar = 'El código ya está asignado a otra clasificación.',
@ErrorTipo = 2;
RETURN;
END;
IF @CveClasificacion IS NULL
BEGIN
INSERT dbo.Clasificaciones
(
Codigo,
Clasificacion,
Estado,
Afectable,
Fecha,
CveUsuario
)
VALUES
(
@Codigo,
@Clasificacion,
@EsActivo,
@Afectable,
CONVERT(date, GETDATE()),
@CveUsuarioEjecuta
);
SET @CveClasificacion = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
IF NOT EXISTS
(
SELECT 1
FROM dbo.Clasificaciones
WHERE CveClasificacion = @CveClasificacion
)
BEGIN
SELECT
@ErrorMostrar = 'La clasificación seleccionada no existe.',
@ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Clasificaciones
SET Codigo = @Codigo,
Clasificacion = @Clasificacion,
Estado = @EsActivo,
Afectable = @Afectable
WHERE CveClasificacion = @CveClasificacion;
END;
SELECT @CveClasificacion AS CveClasificacion;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al guardar la clasificación; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ClasificacionSave'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ClasificacionDelete
@CveClasificacion int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.Clasificaciones
WHERE CveClasificacion = @CveClasificacion
)
BEGIN
SELECT
@ErrorMostrar = 'La clasificación seleccionada no existe.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.ProductosServicios
WHERE CveClasificacion = @CveClasificacion
OR CveClasificacion2 = @CveClasificacion
)
OR EXISTS
(
SELECT 1
FROM dbo.Conta_PrePolizasDetalle
WHERE CveClasificacion = @CveClasificacion
)
BEGIN
SELECT
@ErrorMostrar = 'La clasificación tiene productos, servicios o pólizas relacionados y no puede eliminarse.',
@ErrorTipo = 2;
RETURN;
END;
DELETE dbo.Clasificaciones
WHERE CveClasificacion = @CveClasificacion;
SET @Return = 1;
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 547
BEGIN
SELECT
@ErrorMostrar = 'La clasificación tiene información relacionada y no puede eliminarse.',
@ErrorTipo = 2,
@Return = 0;
RETURN;
END;
SELECT
@ErrorMostrar = 'Ocurrió un error al eliminar la clasificación; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ClasificacionDelete'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_UnidadMedidaList
@Texto varchar(100) = NULL,
@IncluirInactivos bit = 0,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
SET @Texto = NULLIF(LTRIM(RTRIM(@Texto)), '');
SELECT
CveUnidadMedida,
UnidadMedida,
Abreviatura,
Estado AS EsActivo
FROM dbo.UnidadesMedida
WHERE (@IncluirInactivos = 1 OR Estado = 1)
AND
(
@Texto IS NULL
OR UnidadMedida LIKE '%' + @Texto + '%'
OR Abreviatura LIKE '%' + @Texto + '%'
)
ORDER BY UnidadMedida, CveUnidadMedida;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar las unidades de medida; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_UnidadMedidaList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_UnidadMedidaGet
@CveUnidadMedida int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
SELECT
CveUnidadMedida,
UnidadMedida,
Abreviatura,
Estado AS EsActivo
FROM dbo.UnidadesMedida
WHERE CveUnidadMedida = @CveUnidadMedida;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar la unidad de medida; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_UnidadMedidaGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_UnidadMedidaSave
@CveUnidadMedida int = NULL,
@UnidadMedida varchar(50),
@Abreviatura varchar(15),
@EsActivo bit,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
SELECT
@CveUnidadMedida = NULLIF(@CveUnidadMedida, 0),
@UnidadMedida = LTRIM(RTRIM(@UnidadMedida)),
@Abreviatura = LTRIM(RTRIM(@Abreviatura));
IF NULLIF(@UnidadMedida, '') IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Capture la unidad de medida.',
@ErrorTipo = 2;
RETURN;
END;
IF NULLIF(@Abreviatura, '') IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Capture la abreviatura.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.UnidadesMedida
WHERE UnidadMedida = @UnidadMedida
AND CveUnidadMedida <> ISNULL(@CveUnidadMedida, 0)
)
BEGIN
SELECT
@ErrorMostrar = 'Ya existe una unidad de medida con ese nombre.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.UnidadesMedida
WHERE Abreviatura = @Abreviatura
AND CveUnidadMedida <> ISNULL(@CveUnidadMedida, 0)
)
BEGIN
SELECT
@ErrorMostrar = 'La abreviatura ya está asignada a otra unidad de medida.',
@ErrorTipo = 2;
RETURN;
END;
IF @CveUnidadMedida IS NULL
BEGIN
INSERT dbo.UnidadesMedida
(
UnidadMedida,
Abreviatura,
Estado,
Fecha,
CveUsuario
)
VALUES
(
@UnidadMedida,
@Abreviatura,
@EsActivo,
CONVERT(date, GETDATE()),
@CveUsuarioEjecuta
);
SET @CveUnidadMedida = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
IF NOT EXISTS
(
SELECT 1
FROM dbo.UnidadesMedida
WHERE CveUnidadMedida = @CveUnidadMedida
)
BEGIN
SELECT
@ErrorMostrar = 'La unidad de medida seleccionada no existe.',
@ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.UnidadesMedida
SET UnidadMedida = @UnidadMedida,
Abreviatura = @Abreviatura,
Estado = @EsActivo
WHERE CveUnidadMedida = @CveUnidadMedida;
END;
SELECT @CveUnidadMedida AS CveUnidadMedida;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al guardar la unidad de medida; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_UnidadMedidaSave'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_UnidadMedidaDelete
@CveUnidadMedida int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.UnidadesMedida
WHERE CveUnidadMedida = @CveUnidadMedida
)
BEGIN
SELECT
@ErrorMostrar = 'La unidad de medida seleccionada no existe.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.ProductosServicios
WHERE CveUnidadMedida = @CveUnidadMedida
)
OR EXISTS
(
SELECT 1
FROM dbo.Tra_PagosDetalle
WHERE CveUM = @CveUnidadMedida
)
BEGIN
SELECT
@ErrorMostrar = 'La unidad de medida tiene productos, servicios o pagos relacionados y no puede eliminarse.',
@ErrorTipo = 2;
RETURN;
END;
DELETE dbo.UnidadesMedida
WHERE CveUnidadMedida = @CveUnidadMedida;
SET @Return = 1;
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 547
BEGIN
SELECT
@ErrorMostrar = 'La unidad de medida tiene información relacionada y no puede eliminarse.',
@ErrorTipo = 2,
@Return = 0;
RETURN;
END;
SELECT
@ErrorMostrar = 'Ocurrió un error al eliminar la unidad de medida; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_UnidadMedidaDelete'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
DECLARE @Tablas TABLE
(
NombreTablaSQL varchar(128) COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreMostrar varchar(150) COLLATE Modern_Spanish_CS_AS NOT NULL,
CampoLlave varchar(128) COLLATE Modern_Spanish_CS_AS NOT NULL
);
INSERT INTO @Tablas
(NombreTablaSQL, NombreMostrar, CampoLlave)
VALUES
('Clasificaciones', 'Clasificaciones', 'CveClasificacion'),
('UnidadesMedida', 'Unidades de medida', 'CveUnidadMedida');
UPDATE BT
SET NombreMostrar = S.NombreMostrar,
NombreCampoLlaveSQL = S.CampoLlave,
Activo = 1,
FechaMod = GETDATE()
FROM dbo.Bit_Tablas AS BT
INNER JOIN @Tablas AS S
ON S.NombreTablaSQL = BT.NombreTablaSQL;
INSERT dbo.Bit_Tablas
(NombreTablaSQL, NombreMostrar, Descripcion, NombreCampoLlaveSQL, Activo)
SELECT
S.NombreTablaSQL,
S.NombreMostrar,
'Catálogo general de productos y servicios.',
S.CampoLlave,
1
FROM @Tablas AS S
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Bit_Tablas AS BT
WHERE BT.NombreTablaSQL = S.NombreTablaSQL
);
INSERT dbo.Bit_Campos
(CveTabla, NombreCampoSQL, NombreMostrar, MostrarEnBitacora, TipoDatoSQL, Activo)
SELECT
BT.CveTabla,
C.name,
C.name,
CASE WHEN C.name = S.CampoLlave THEN 0 ELSE 1 END,
TY.name,
1
FROM @Tablas AS S
INNER JOIN sys.tables AS T
ON T.name COLLATE Modern_Spanish_CS_AS = S.NombreTablaSQL
INNER JOIN sys.schemas AS SC
ON SC.schema_id = T.schema_id
AND SC.name = 'dbo'
INNER JOIN sys.columns AS C
ON C.object_id = T.object_id
INNER JOIN sys.types AS TY
ON TY.user_type_id = C.user_type_id
INNER JOIN dbo.Bit_Tablas AS BT
ON BT.NombreTablaSQL = S.NombreTablaSQL
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Bit_Campos AS BC
WHERE BC.CveTabla = BT.CveTabla
AND BC.NombreCampoSQL = C.name COLLATE Modern_Spanish_CS_AS
);
GO

View File

@@ -0,0 +1,414 @@
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
SET XACT_ABORT ON;
GO
/*
Catálogos postales para el registro público.
Este script NO elimina, vacía ni recrea las tablas pobladas.
Solamente agrega columnas/índices faltantes y crea o actualiza
el procedimiento almacenado de consulta.
*/
IF OBJECT_ID(N'dbo.Gral_SAT_CP', N'U') IS NULL
THROW 51020, N'Falta la tabla poblada dbo.Gral_SAT_CP.', 1;
IF OBJECT_ID(N'dbo.Gral_SAT_Municipio', N'U') IS NULL
THROW 51021, N'Falta la tabla poblada dbo.Gral_SAT_Municipio.', 1;
IF OBJECT_ID(N'dbo.Gral_SAT_Localidad', N'U') IS NULL
THROW 51022, N'Falta la tabla poblada dbo.Gral_SAT_Localidad.', 1;
IF OBJECT_ID(N'dbo.Gral_SAT_Colonia', N'U') IS NULL
THROW 51023, N'Falta la tabla poblada dbo.Gral_SAT_Colonia.', 1;
IF OBJECT_ID(N'dbo.Gral_SAT_Estado', N'U') IS NULL
THROW 51024, N'Falta la tabla poblada dbo.Gral_SAT_Estado.', 1;
IF OBJECT_ID(N'dbo.Gral_SAT_Pais', N'U') IS NULL
THROW 51025, N'Falta la tabla poblada dbo.Gral_SAT_Pais.', 1;
GO
/* Borrado lógico incremental para los catálogos utilizados. */
DECLARE @Tablas TABLE ([Tabla] sysname NOT NULL PRIMARY KEY);
INSERT INTO @Tablas ([Tabla])
VALUES
(N'Gral_SAT_CP'),
(N'Gral_SAT_Municipio'),
(N'Gral_SAT_Localidad'),
(N'Gral_SAT_Colonia'),
(N'Gral_SAT_Estado'),
(N'Gral_SAT_Pais');
DECLARE @Tabla sysname;
DECLARE @Sql nvarchar(max);
DECLARE Catalogos CURSOR LOCAL FAST_FORWARD FOR SELECT [Tabla] FROM @Tablas ORDER BY [Tabla];
OPEN Catalogos;
FETCH NEXT FROM Catalogos INTO @Tabla;
WHILE @@FETCH_STATUS = 0
BEGIN
IF COL_LENGTH(N'dbo.' + @Tabla, N'Borrado') IS NULL
BEGIN
SET @Sql = N'ALTER TABLE [dbo].' + QUOTENAME(@Tabla)
+ N' ADD [Borrado] bit NOT NULL CONSTRAINT '
+ QUOTENAME(N'DF_' + @Tabla + N'_Borrado')
+ N' DEFAULT ((0)) WITH VALUES;';
EXEC sys.sp_executesql @Sql;
END;
IF COL_LENGTH(N'dbo.' + @Tabla, N'FechaBorrado') IS NULL
BEGIN
SET @Sql = N'ALTER TABLE [dbo].' + QUOTENAME(@Tabla)
+ N' ADD [FechaBorrado] datetime2(0) NULL;';
EXEC sys.sp_executesql @Sql;
END;
IF NOT EXISTS
(
SELECT 1
FROM sys.check_constraints
WHERE [parent_object_id] = OBJECT_ID(N'dbo.' + @Tabla)
AND [name] = N'CK_' + @Tabla + N'_BorradoLogico'
)
BEGIN
SET @Sql = N'ALTER TABLE [dbo].' + QUOTENAME(@Tabla)
+ N' ADD CONSTRAINT ' + QUOTENAME(N'CK_' + @Tabla + N'_BorradoLogico')
+ N' CHECK (([Borrado] = (0) AND [FechaBorrado] IS NULL)'
+ N' OR ([Borrado] = (1) AND [FechaBorrado] IS NOT NULL));';
EXEC sys.sp_executesql @Sql;
END;
FETCH NEXT FROM Catalogos INTO @Tabla;
END;
CLOSE Catalogos;
DEALLOCATE Catalogos;
GO
IF NOT EXISTS
(
SELECT 1 FROM sys.indexes
WHERE [object_id] = OBJECT_ID(N'dbo.Gral_SAT_CP')
AND [name] = N'IX_Gral_SAT_CP_BusquedaRegistro'
)
CREATE NONCLUSTERED INDEX [IX_Gral_SAT_CP_BusquedaRegistro]
ON [dbo].[Gral_SAT_CP] ([CP])
INCLUDE ([CveCP], [ClaveSATEstado], [ClaveSATMunicipio], [ClaveSATLocalidad])
WHERE [Borrado] = (0);
GO
IF NOT EXISTS
(
SELECT 1 FROM sys.indexes
WHERE [object_id] = OBJECT_ID(N'dbo.Gral_SAT_Colonia')
AND [name] = N'IX_Gral_SAT_Colonia_CP_Vigente'
)
CREATE NONCLUSTERED INDEX [IX_Gral_SAT_Colonia_CP_Vigente]
ON [dbo].[Gral_SAT_Colonia] ([CP])
INCLUDE ([CveColonia], [ClaveSATColonia], [NombreAsentamiento])
WHERE [Borrado] = (0);
GO
IF NOT EXISTS
(
SELECT 1 FROM sys.indexes
WHERE [object_id] = OBJECT_ID(N'dbo.Gral_SAT_Municipio')
AND [name] = N'IX_Gral_SAT_Municipio_Claves_Vigente'
)
CREATE NONCLUSTERED INDEX [IX_Gral_SAT_Municipio_Claves_Vigente]
ON [dbo].[Gral_SAT_Municipio] ([ClaveSATEstado], [ClaveSATMunicipio])
INCLUDE ([CveMunicipio], [Descripcion])
WHERE [Borrado] = (0);
GO
IF NOT EXISTS
(
SELECT 1 FROM sys.indexes
WHERE [object_id] = OBJECT_ID(N'dbo.Gral_SAT_Localidad')
AND [name] = N'IX_Gral_SAT_Localidad_Claves_Vigente'
)
CREATE NONCLUSTERED INDEX [IX_Gral_SAT_Localidad_Claves_Vigente]
ON [dbo].[Gral_SAT_Localidad] ([ClaveSATEstado], [ClaveSATLocalidad])
INCLUDE ([CveLocalidad], [NombreLocalidad])
WHERE [Borrado] = (0);
GO
/* Claves normalizadas utilizadas por el registro. */
IF OBJECT_ID(N'dbo.Clientes', N'U') IS NULL
THROW 51026, N'Falta la tabla dbo.Clientes.', 1;
IF COL_LENGTH(N'dbo.Clientes', N'CveLocalidad') IS NULL
ALTER TABLE [dbo].[Clientes] ADD [CveLocalidad] int NULL;
GO
IF OBJECT_ID(N'dbo.FK_Clientes_Gral_SAT_Pais', N'F') IS NULL
AND NOT EXISTS (SELECT 1 FROM [dbo].[Clientes] C LEFT JOIN [dbo].[Gral_SAT_Pais] P ON P.[CvePais]=C.[CvePais] WHERE C.[CvePais] IS NOT NULL AND P.[CvePais] IS NULL)
ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [FK_Clientes_Gral_SAT_Pais] FOREIGN KEY ([CvePais]) REFERENCES [dbo].[Gral_SAT_Pais] ([CvePais]);
GO
IF OBJECT_ID(N'dbo.FK_Clientes_Gral_SAT_Estado_Normalizado', N'F') IS NULL
AND NOT EXISTS (SELECT 1 FROM [dbo].[Clientes] C LEFT JOIN [dbo].[Gral_SAT_Estado] E ON E.[CveEstado]=C.[CveEstado] WHERE C.[CveEstado] IS NOT NULL AND E.[CveEstado] IS NULL)
ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [FK_Clientes_Gral_SAT_Estado_Normalizado] FOREIGN KEY ([CveEstado]) REFERENCES [dbo].[Gral_SAT_Estado] ([CveEstado]);
GO
IF OBJECT_ID(N'dbo.FK_Clientes_Gral_SAT_Municipio', N'F') IS NULL
AND NOT EXISTS (SELECT 1 FROM [dbo].[Clientes] C LEFT JOIN [dbo].[Gral_SAT_Municipio] M ON M.[CveMunicipio]=C.[CveMunicipio] WHERE C.[CveMunicipio] IS NOT NULL AND M.[CveMunicipio] IS NULL)
ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [FK_Clientes_Gral_SAT_Municipio] FOREIGN KEY ([CveMunicipio]) REFERENCES [dbo].[Gral_SAT_Municipio] ([CveMunicipio]);
GO
IF OBJECT_ID(N'dbo.FK_Clientes_Gral_SAT_Localidad', N'F') IS NULL
ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [FK_Clientes_Gral_SAT_Localidad] FOREIGN KEY ([CveLocalidad]) REFERENCES [dbo].[Gral_SAT_Localidad] ([CveLocalidad]);
GO
IF OBJECT_ID(N'dbo.FK_Clientes_Gral_SAT_Colonia', N'F') IS NULL
AND NOT EXISTS (SELECT 1 FROM [dbo].[Clientes] C LEFT JOIN [dbo].[Gral_SAT_Colonia] CO ON CO.[CveColonia]=C.[CveColonia] WHERE C.[CveColonia] IS NOT NULL AND CO.[CveColonia] IS NULL)
ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [FK_Clientes_Gral_SAT_Colonia] FOREIGN KEY ([CveColonia]) REFERENCES [dbo].[Gral_SAT_Colonia] ([CveColonia]);
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Gral_CodigoPostalGet]
@CP varchar(5),
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
SET @CP = LTRIM(RTRIM(@CP));
BEGIN TRY
IF LEN(@CP) <> 5 OR @CP LIKE '%[^0-9]%'
BEGIN
SET @ErrorMostrar = 'El código postal debe contener exactamente 5 dígitos.';
SET @ErrorTipo = 2;
RETURN;
END;
DECLARE
@CvePais int,
@Pais varchar(100),
@CveEstado int,
@Estado varchar(50),
@CveMunicipio int,
@Municipio varchar(100),
@CveLocalidad int,
@Localidad varchar(100);
SELECT TOP (1)
@CvePais = P.[CvePais],
@Pais = P.[Descripcion],
@CveEstado = E.[CveEstado],
@Estado = E.[NombreEstado],
@CveMunicipio = M.[CveMunicipio],
@Municipio = M.[Descripcion],
@CveLocalidad = L.[CveLocalidad],
@Localidad = L.[NombreLocalidad]
FROM [dbo].[Gral_SAT_CP] AS CP
INNER JOIN [dbo].[Gral_SAT_Estado] AS E
ON E.[ClaveSATEstado] = CP.[ClaveSATEstado]
AND E.[Borrado] = (0)
INNER JOIN [dbo].[Gral_SAT_Pais] AS P
ON P.[ClaveSATPais] = E.[ClaveSATPais]
AND P.[Borrado] = (0)
INNER JOIN [dbo].[Gral_SAT_Municipio] AS M
ON M.[ClaveSATEstado] = CP.[ClaveSATEstado]
AND M.[ClaveSATMunicipio] = CP.[ClaveSATMunicipio]
AND M.[Borrado] = (0)
LEFT JOIN [dbo].[Gral_SAT_Localidad] AS L
ON L.[ClaveSATEstado] = CP.[ClaveSATEstado]
AND L.[ClaveSATLocalidad] = CP.[ClaveSATLocalidad]
AND L.[Borrado] = (0)
WHERE CP.[CP] = @CP
AND CP.[Borrado] = (0);
IF @CvePais IS NULL OR @CveEstado IS NULL OR @CveMunicipio IS NULL
BEGIN
SET @ErrorMostrar = CONCAT(
'El código postal ', @CP,
' no existe o sus relaciones de país, estado y municipio están incompletas.');
SET @ErrorTipo = 2;
RETURN;
END;
SELECT
@CvePais AS [CvePais],
@Pais AS [Pais],
@CveEstado AS [CveEstado],
@Estado AS [Estado],
@CveMunicipio AS [CveMunicipio],
@Municipio AS [Municipio],
@CveLocalidad AS [CveLocalidad],
@Localidad AS [Localidad],
COALESCE(NULLIF(@Localidad, ''), @Municipio) AS [Ciudad];
SELECT
C.[CveColonia],
C.[NombreAsentamiento]
FROM [dbo].[Gral_SAT_Colonia] AS C
WHERE C.[CP] = @CP
AND C.[Borrado] = (0)
ORDER BY C.[NombreAsentamiento];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar el código postal; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @E nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', ERROR_PROCEDURE(),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_RegistroClienteAdd]
@NombreUsuario varchar(100),
@HashContrasena varchar(500),
@CorreoElectronico varchar(255),
@RFC varchar(15),
@RazonSocial varchar(200),
@NombreComercial varchar(200) = NULL,
@Direccion varchar(90),
@NoExt varchar(20) = NULL,
@NoInt varchar(50) = NULL,
@Colonia varchar(100),
@Ciudad varchar(100),
@CveSATEstado int,
@Pais varchar(100) = 'México',
@CP varchar(5),
@Telefono varchar(25) = NULL,
@CvePais int,
@CveMunicipio int,
@CveLocalidad int = NULL,
@CveColonia int,
@HashToken char(64),
@HorasExpiracion int = 24,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
DECLARE @CveRolEmpresa int, @CveUsuario int, @CveCliente int;
DECLARE @NombreEstado varchar(50), @PaisCatalogo varchar(100);
DECLARE @CiudadCatalogo varchar(100), @ColoniaCatalogo varchar(100);
SET @NombreUsuario = LTRIM(RTRIM(@NombreUsuario));
SET @CorreoElectronico = LOWER(LTRIM(RTRIM(@CorreoElectronico)));
SET @RFC = UPPER(REPLACE(LTRIM(RTRIM(@RFC)), ' ', ''));
SET @CP = LTRIM(RTRIM(@CP));
SELECT @CveRolEmpresa = [CveRol]
FROM [dbo].[Sis_Roles]
WHERE [NombreRol] = 'Empresa' AND [Activo] = (1) AND [Borrado] = (0);
SELECT TOP (1)
@NombreEstado = LEFT(E.[NombreEstado], 35),
@PaisCatalogo = LEFT(P.[Descripcion], 50),
@CiudadCatalogo = LEFT(COALESCE(NULLIF(L.[NombreLocalidad], ''), M.[Descripcion]), 50),
@ColoniaCatalogo = LEFT(C.[NombreAsentamiento], 50)
FROM [dbo].[Gral_SAT_CP] AS CP
INNER JOIN [dbo].[Gral_SAT_Estado] AS E
ON E.[ClaveSATEstado] = CP.[ClaveSATEstado]
AND E.[CveEstado] = @CveSATEstado AND E.[Borrado] = (0)
INNER JOIN [dbo].[Gral_SAT_Pais] AS P
ON P.[ClaveSATPais] = E.[ClaveSATPais]
AND P.[CvePais] = @CvePais AND P.[Borrado] = (0)
INNER JOIN [dbo].[Gral_SAT_Municipio] AS M
ON M.[ClaveSATEstado] = CP.[ClaveSATEstado]
AND M.[ClaveSATMunicipio] = CP.[ClaveSATMunicipio]
AND M.[CveMunicipio] = @CveMunicipio AND M.[Borrado] = (0)
LEFT JOIN [dbo].[Gral_SAT_Localidad] AS L
ON L.[ClaveSATEstado] = CP.[ClaveSATEstado]
AND L.[ClaveSATLocalidad] = CP.[ClaveSATLocalidad] AND L.[Borrado] = (0)
INNER JOIN [dbo].[Gral_SAT_Colonia] AS C
ON C.[CP] = CP.[CP] AND C.[CveColonia] = @CveColonia AND C.[Borrado] = (0)
WHERE CP.[CP] = @CP AND CP.[Borrado] = (0)
AND (@CveLocalidad IS NULL OR L.[CveLocalidad] = @CveLocalidad);
IF @CveRolEmpresa IS NULL
BEGIN
SELECT @ErrorMostrar = 'No fue posible determinar el rol Empresa.', @ErrorTipo = 1;
RETURN;
END;
IF @NombreEstado IS NULL OR @PaisCatalogo IS NULL OR @CiudadCatalogo IS NULL OR @ColoniaCatalogo IS NULL
BEGIN
SELECT @ErrorMostrar = 'Los datos del código postal no coinciden con los catálogos vigentes. Actualiza el código postal.', @ErrorTipo = 2;
RETURN;
END;
SELECT @Pais = @PaisCatalogo, @Ciudad = @CiudadCatalogo, @Colonia = @ColoniaCatalogo;
IF EXISTS (SELECT 1 FROM [dbo].[Sis_Usuarios] WHERE [NombreUsuario] = @NombreUsuario)
OR EXISTS (SELECT 1 FROM [dbo].[Sis_Usuarios] WHERE LOWER([CorreoElectronico]) = @CorreoElectronico)
OR EXISTS (SELECT 1 FROM [dbo].[Clientes] WHERE UPPER(REPLACE(LTRIM(RTRIM([RFC])), ' ', '')) = @RFC)
BEGIN
SELECT @ErrorMostrar = 'Los datos ya fueron registrados por otra solicitud. Actualiza la página e inténtalo nuevamente.', @ErrorTipo = 2;
RETURN;
END;
INSERT INTO [dbo].[Sis_Usuarios]
([NombreUsuario], [HashContrasena], [CorreoElectronico], [CveRol], [Activo], [DebeCambiarContrasena], [CorreoVerificado])
VALUES (@NombreUsuario, @HashContrasena, @CorreoElectronico, @CveRolEmpresa, (0), (0), (0));
SET @CveUsuario = CONVERT(int, SCOPE_IDENTITY());
INSERT INTO [dbo].[Clientes]
([Nombre], [NombreComercial], [Direccion], [NoExt], [NoInt], [Colonia],
[Ciudad], [Estado], [CveSATEstado], [Pais], [RFC], [CP], [Telefono],
[Mail], [Estatus], [Fecha], [CveUsuario], [FechaIng],
[CvePais], [CveEstado], [CveMunicipio], [CveLocalidad], [CveColonia])
VALUES
(@RazonSocial, NULLIF(@NombreComercial, ''), @Direccion, NULLIF(@NoExt, ''),
NULLIF(@NoInt, ''), @Colonia, @Ciudad, @NombreEstado, @CveSATEstado,
@Pais, @RFC, @CP, NULLIF(@Telefono, ''), @CorreoElectronico, (0),
CONVERT(date, GETDATE()), @CveUsuario, GETDATE(),
@CvePais, @CveSATEstado, @CveMunicipio, @CveLocalidad, @CveColonia);
SET @CveCliente = CONVERT(int, SCOPE_IDENTITY());
INSERT INTO [dbo].[Sis_UsuariosClientes]
([CveUsuario], [CveCliente], [Orden], [EsPrincipal], [Activo], [CveUsuarioRegistro])
VALUES (@CveUsuario, @CveCliente, (1), (1), (1), @CveUsuario);
INSERT INTO [dbo].[Sis_UsuariosVerificacionesCorreo]
([CveUsuario], [CveClienteRegistro], [HashToken], [FechaExpiracion])
VALUES (@CveUsuario, @CveCliente, @HashToken, DATEADD(HOUR, @HorasExpiracion, SYSDATETIME()));
SELECT @CveUsuario AS [CveUsuario], @CveCliente AS [CveCliente];
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT @ErrorMostrar = 'Ocurrió un error al crear el registro; favor de contactar a Sistemas.', @ErrorTipo = 1, @Return = 0;
DECLARE @E nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', ERROR_PROCEDURE(), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @E);
END CATCH;
END;
GO
/*
Se registran para limpieza, pero la limpieza física queda deshabilitada.
Habilitarla posteriormente requiere autorización expresa.
*/
IF OBJECT_ID(N'dbo.Sis_ConfigurarLimpieza', N'P') IS NOT NULL
BEGIN
EXEC [dbo].[Sis_ConfigurarLimpieza] @Esquema=N'dbo', @Tabla=N'Gral_SAT_CP', @DiasRetencion=365, @TamanoLote=500, @Habilitada=0;
EXEC [dbo].[Sis_ConfigurarLimpieza] @Esquema=N'dbo', @Tabla=N'Gral_SAT_Municipio', @DiasRetencion=365, @TamanoLote=500, @Habilitada=0;
EXEC [dbo].[Sis_ConfigurarLimpieza] @Esquema=N'dbo', @Tabla=N'Gral_SAT_Localidad', @DiasRetencion=365, @TamanoLote=500, @Habilitada=0;
EXEC [dbo].[Sis_ConfigurarLimpieza] @Esquema=N'dbo', @Tabla=N'Gral_SAT_Colonia', @DiasRetencion=365, @TamanoLote=500, @Habilitada=0;
EXEC [dbo].[Sis_ConfigurarLimpieza] @Esquema=N'dbo', @Tabla=N'Gral_SAT_Estado', @DiasRetencion=365, @TamanoLote=500, @Habilitada=0;
EXEC [dbo].[Sis_ConfigurarLimpieza] @Esquema=N'dbo', @Tabla=N'Gral_SAT_Pais', @DiasRetencion=365, @TamanoLote=500, @Habilitada=0;
END;
GO

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[07/29/26 11:01:05] info ================= cer started =================
[07/29/26 11:01:05] info C:\Program Files\Autodesk\AutoCAD 2027\cer.dll, 7.2.4+20251128.8f05bb68.927
[07/29/26 11:01:05] info Setting key SP/SDK_VERSION, value 7.2.4+20251128.8f05bb68.927 (maxCount 1)
[07/29/26 11:01:05] info Setting key SP/PRODUCT_NAME_HASH, value f4bac121a1625586cb5b9106c8e839a7990f2b6c (maxCount 1)
[07/29/26 11:01:05] info Setting key SP/RUNTIME_ARCH, value 1 (maxCount 1)
[07/29/26 11:01:05] info Set senddmp exe path to C:\Program Files\Autodesk\AutoCAD 2027\CER\senddmp.exe
[07/29/26 11:01:05] info The cer_service exe C:\Program Files\Autodesk\AutoCAD 2027\CER\service\cer_service.exe is not in folder C:\Program Files\Autodesk\AutoCAD 2027\CER\, it's not a sandbox
[07/29/26 11:01:05] info Set upi exe path to C:\Program Files\Autodesk\AutoCAD 2027\CER\upi.exe
[07/29/26 11:01:05] info launching C:\Program Files\Autodesk\AutoCAD 2027\CER\upi.exe --cmd=get-device-id C:\Users\caudi\AppData\Local\Temp\15FCE767F24F74D1\Temp\upi_deviceid2
[07/29/26 11:01:06] info Set deviceID2 to 92CA75B8D4EB0A0E74EDB1E61E362886DC67039BD12745B7CEF6A36A94EA9884&1D8D189A9AE197CDA5D2D77E640375435D8D952FEBE5E1B888B8567C4BECED88&0A3B0E00D8EB341B2395D85AAC2E422CF0C9599C67A5867798DFE9D60B41E70E
[07/29/26 11:01:06] info Setting key SP/DEVICEID2, value 92CA75B8D4EB0A0E74EDB1E61E362886DC67039BD12745B7CEF6A36A94EA9884&1D8D189A9AE197CDA5D2D77E640375435D8D952FEBE5E1B888B8567C4BECED88&0A3B0E00D8EB341B2395D85AAC2E422CF0C9599C67A5867798DFE9D60B41E70E (maxCount 1)
[07/29/26 11:01:06] info Setting key SP/UUID, value f4bac121a1625586cb5b9106c8e839a7990f2b6c92CA75B8D4EB0A0E74EDB1E61E362886DC67039BD12745B7CEF6A36A94EA9884&1D8D189A9AE197CDA5D2D77E640375435D8D952FEBE5E1B888B8567C4BECED88&0A3B0E00D8EB341B2395D85AAC2E422CF0C9599C67A5867798DFE9D60B41E70E (maxCount 1)
[07/29/26 11:01:06] info Set senddmp exe path to C:\Program Files\Autodesk\AutoCAD 2027\CER\senddmp.exe
[07/29/26 11:01:06] info The cer_service exe C:\Program Files\Autodesk\AutoCAD 2027\CER\service\cer_service.exe is not in folder C:\Program Files\Autodesk\AutoCAD 2027\CER\, it's not a sandbox
[07/29/26 11:01:06] info launching C:\Program Files\Autodesk\AutoCAD 2027\CER\upi.exe "C:\Program Files\Autodesk\AutoCAD 2027\es-ES\UPI\upiconfig.xml" C:\Users\caudi\AppData\Local\Temp\15FCE767F24F74D1\Temp\upi_info.xml
[07/29/26 11:01:07] info Setting key SP/UPI_PRODUCT, value ACD (maxCount 1)
[07/29/26 11:01:07] info Setting key SP/UPI_RELEASE, value 2027 (maxCount 1)
[07/29/26 11:01:07] info Setting key SP/UPI_MASTER, value {28B89EEF-A101-040A-2102-CF3F3A09B77D} (maxCount 1)
[07/29/26 11:01:07] info Setting key SP/UPI_BUILD, value 26.0.60.0.0 (maxCount 1)
[07/29/26 11:01:07] info Setting key SP/UPI_FULL_XML, value <?xml version="1.0"?><upipackage><upivalue version="1.0" type="product" requestingapp="true"><level name="productline" id="ACD"><level name="release" id="2027"><level name="master" id="{28B89EEF-A101-040A-2102-CF3F3A09B77D}"><level name="build" id="26.0.60.0.0"/></level></level></level></upivalue>
<upivalue version="1.0" type="product"><level name="productline" id="ACD"><level name="release" id="2027"><level name="master" id="{28B89EEF-A101-040A-1102-CF3F3A09B77D}"><level name="build" id="26.0.60.0.0"/></level></level></level></upivalue>
<upivalue version="1.0" type="product"><level name="productline" id="ARCHDESK"><level name="release" id="2027"><level name="master" id="{28B89EEE-A104-0000-5102-CF3F3A09B77D}"><level name="build" id="8.9.46.0"/></level></level></level></upivalue>
<upivalue version="1.0" type="product"><level name="productline" id="ACD"><level name="release" id="2027"><level name="master" id="{28B89EEF-A101-0000-0102-CF3F3A09B77D}"><level name="build" id="26.0.60.0.0"/></level></level></level></upivalue>
</upipackage> (maxCount 1)
[07/29/26 11:01:07] info set legacy options: /APPICON "C:\Program Files\Autodesk\AutoCAD 2027\AcBrandRes.dll" /APPICONID 1
[07/29/26 11:01:07] info Setting key RP/AppIcon, value C:\Program Files\Autodesk\AutoCAD 2027\AcBrandRes.dll (maxCount 1)
[07/29/26 11:01:07] info Setting key RP/AppIconId, value 1 (maxCount 1)
[07/29/26 11:01:07] info Setting key RP/CadSettingsRegPath, value Software\Autodesk\AutoCAD\R26.0\ACAD-A101:40A\CadManagerControl\CustomerErrorReport (maxCount 1)
[07/29/26 11:01:07] info Setting key RP/AppLocaleId, value 1034 (maxCount 1)
[07/29/26 11:01:07] info Setting key RP/AppXML, value <ProductInformation name ="AutoCAD" build_version="X.60.0.0(x64)" registry_version="26.0" install_id_string="15FCE767F24F74D1" registry_localeID="1034" git_commit_id="90c984aa66a571142ee0757584bac517eec2175a" /> (maxCount 100)
[07/29/26 11:01:07] info Setting key SP/THEME_TYPE, value Blue (maxCount 1)
[07/29/26 11:01:07] info Setting key SP/EXCEPTION_INFO_POINTER, value 140710146442520 (maxCount 1)
[07/29/26 11:01:07] info Setting key SP/THREAD_ID, value 4294967295 (maxCount 1)
[07/29/26 11:01:07] info Get key SP/THREAD_ID, index 0: "4294967295"
[07/29/26 11:01:07] info Setting key SP/WER, value 0 (maxCount 1)
[07/29/26 11:01:07] info Get key SP/WER, index 0: "0"
[07/29/26 11:01:07] info Registered C:\Program Files\Autodesk\AutoCAD 2027\cer.dll as WER runtime exception module
[07/29/26 11:01:07] info Current ErrorMode is 32769
[07/29/26 11:01:07] debug Receiver ping: pong
[07/29/26 11:01:17] debug Receiver ping: pong

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -119,7 +119,6 @@ CREATE OR ALTER PROCEDURE [dbo].[Sis_ConfigurarLimpieza]
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
IF @DiasRetencion NOT BETWEEN 30 AND 3650
THROW 51000, N'Los días de retención deben estar entre 30 y 3650.', 1;
@@ -180,7 +179,6 @@ CREATE OR ALTER PROCEDURE [dbo].[Sis_LimpiarRegistrosBorrados]
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
IF @MaximoLotesPorTabla NOT BETWEEN 1 AND 10000
THROW 51010, N'El máximo de lotes debe estar entre 1 y 10000.', 1;

View File

@@ -31,10 +31,10 @@ GO
CREATE TABLE [dbo].[Fraccionamientos] (
[CveFraccionamiento] int IDENTITY(1,1) NOT NULL,
[CveCliente] int NOT NULL,
[Fraccionamiento] varchar(200) COLLATE Modern_Spanish_CS_AI NOT NULL,
[Fraccionamiento] varchar(200) COLLATE Modern_Spanish_CS_AS NOT NULL,
[Hectareas] decimal(18,4) NULL,
[Ubicacion] varchar(500) COLLATE Modern_Spanish_CS_AI NULL,
[Estatus] varchar(50) COLLATE Modern_Spanish_CS_AI NULL,
[Ubicacion] varchar(500) COLLATE Modern_Spanish_CS_AS NULL,
[Estatus] varchar(50) COLLATE Modern_Spanish_CS_AS NULL,
[EsActivo] bit CONSTRAINT [DF_Fraccionamientos_EsActivo] DEFAULT ((1)) NOT NULL,
[FechaAlta] datetime CONSTRAINT [DF_Fraccionamientos_FechaAlta] DEFAULT (GETDATE()) NOT NULL,
[FechaModificacion] datetime NULL,
@@ -49,7 +49,7 @@ GO
CREATE TABLE [dbo].[FraccionamientosEtapas] (
[CveFraccionamientoEtapa] int IDENTITY(1,1) NOT NULL,
[CveFraccionamiento] int NOT NULL,
[Etapa] varchar(150) COLLATE Modern_Spanish_CS_AI NOT NULL,
[Etapa] varchar(150) COLLATE Modern_Spanish_CS_AS NOT NULL,
[Hectareas] decimal(18,4) NULL,
[Orden] int CONSTRAINT [DF_FraccionamientosEtapas_Orden] DEFAULT ((0)) NOT NULL,
[EsActivo] bit CONSTRAINT [DF_FraccionamientosEtapas_EsActivo] DEFAULT ((1)) NOT NULL,
@@ -66,12 +66,12 @@ GO
CREATE TABLE [dbo].[FraccionamientosLotes] (
[CveFraccionamientoLote] int IDENTITY(1,1) NOT NULL,
[CveFraccionamientoEtapa] int NOT NULL,
[Tipo] varchar(100) COLLATE Modern_Spanish_CS_AI NULL,
[Calle] varchar(200) COLLATE Modern_Spanish_CS_AI NULL,
[Catastro] varchar(100) COLLATE Modern_Spanish_CS_AI NULL,
[Tipo] varchar(100) COLLATE Modern_Spanish_CS_AS NULL,
[Calle] varchar(200) COLLATE Modern_Spanish_CS_AS NULL,
[Catastro] varchar(100) COLLATE Modern_Spanish_CS_AS NULL,
[MetrosCuadrados] decimal(18,4) NULL,
[Numero] varchar(50) COLLATE Modern_Spanish_CS_AI NULL,
[Duplicador] varchar(50) COLLATE Modern_Spanish_CS_AI NULL,
[Numero] varchar(50) COLLATE Modern_Spanish_CS_AS NULL,
[Duplicador] varchar(50) COLLATE Modern_Spanish_CS_AS NULL,
[EsActivo] bit CONSTRAINT [DF_FraccionamientosLotes_EsActivo] DEFAULT ((1)) NOT NULL,
[FechaAlta] datetime CONSTRAINT [DF_FraccionamientosLotes_FechaAlta] DEFAULT (GETDATE()) NOT NULL,
[FechaModificacion] datetime NULL,
@@ -85,9 +85,9 @@ GO
CREATE TABLE [dbo].[Tra_TiposTramite] (
[CveTipoTramite] int IDENTITY(1,1) NOT NULL,
[Codigo] varchar(50) COLLATE Modern_Spanish_CS_AI NOT NULL,
[TipoTramite] varchar(200) COLLATE Modern_Spanish_CS_AI NOT NULL,
[Descripcion] varchar(500) COLLATE Modern_Spanish_CS_AI NULL,
[Codigo] varchar(50) COLLATE Modern_Spanish_CI_AS NOT NULL,
[TipoTramite] varchar(200) COLLATE Modern_Spanish_CS_AS NOT NULL,
[Descripcion] varchar(500) COLLATE Modern_Spanish_CS_AS NULL,
[Orden] int CONSTRAINT [DF_Tra_TiposTramite_Orden] DEFAULT ((0)) NOT NULL,
[EsActivo] bit CONSTRAINT [DF_Tra_TiposTramite_EsActivo] DEFAULT ((1)) NOT NULL,
[FechaAlta] datetime CONSTRAINT [DF_Tra_TiposTramite_FechaAlta] DEFAULT (GETDATE()) NOT NULL,
@@ -100,8 +100,8 @@ GO
CREATE TABLE [dbo].[Tra_EstatusSolicitud] (
[CveEstatusSolicitud] int IDENTITY(1,1) NOT NULL,
[Codigo] varchar(50) COLLATE Modern_Spanish_CS_AI NOT NULL,
[EstatusSolicitud] varchar(100) COLLATE Modern_Spanish_CS_AI NOT NULL,
[Codigo] varchar(50) COLLATE Modern_Spanish_CI_AS NOT NULL,
[EstatusSolicitud] varchar(100) COLLATE Modern_Spanish_CS_AS NOT NULL,
[Orden] int CONSTRAINT [DF_Tra_EstatusSolicitud_Orden] DEFAULT ((0)) NOT NULL,
[EsFinal] bit CONSTRAINT [DF_Tra_EstatusSolicitud_EsFinal] DEFAULT ((0)) NOT NULL,
[EsActivo] bit CONSTRAINT [DF_Tra_EstatusSolicitud_EsActivo] DEFAULT ((1)) NOT NULL,
@@ -112,9 +112,9 @@ GO
CREATE TABLE [dbo].[Tra_TiposDocumento] (
[CveTipoDocumento] int IDENTITY(1,1) NOT NULL,
[TipoDocumento] varchar(200) COLLATE Modern_Spanish_CS_AI NOT NULL,
[Descripcion] varchar(500) COLLATE Modern_Spanish_CS_AI NULL,
[ExtensionesPermitidas] varchar(200) COLLATE Modern_Spanish_CS_AI NULL,
[TipoDocumento] varchar(200) COLLATE Modern_Spanish_CS_AS NOT NULL,
[Descripcion] varchar(500) COLLATE Modern_Spanish_CS_AS NULL,
[ExtensionesPermitidas] varchar(200) COLLATE Modern_Spanish_CS_AS NULL,
[TamanoMaximoMb] int NULL,
[EsActivo] bit CONSTRAINT [DF_Tra_TiposDocumento_EsActivo] DEFAULT ((1)) NOT NULL,
[FechaAlta] datetime CONSTRAINT [DF_Tra_TiposDocumento_FechaAlta] DEFAULT (GETDATE()) NOT NULL,
@@ -128,8 +128,8 @@ GO
CREATE TABLE [dbo].[Tra_TiposPregunta] (
[CveTipoPregunta] int IDENTITY(1,1) NOT NULL,
[Codigo] varchar(50) COLLATE Modern_Spanish_CS_AI NOT NULL,
[TipoPregunta] varchar(100) COLLATE Modern_Spanish_CS_AI NOT NULL,
[Codigo] varchar(50) COLLATE Modern_Spanish_CI_AS NOT NULL,
[TipoPregunta] varchar(100) COLLATE Modern_Spanish_CS_AS NOT NULL,
[EsActivo] bit CONSTRAINT [DF_Tra_TiposPregunta_EsActivo] DEFAULT ((1)) NOT NULL,
CONSTRAINT [PK_Tra_TiposPregunta] PRIMARY KEY CLUSTERED ([CveTipoPregunta]),
CONSTRAINT [UQ_Tra_TiposPregunta_Codigo] UNIQUE NONCLUSTERED ([Codigo])
@@ -139,8 +139,8 @@ GO
CREATE TABLE [dbo].[Tra_Preguntas] (
[CvePregunta] int IDENTITY(1,1) NOT NULL,
[CveTipoPregunta] int NOT NULL,
[Pregunta] varchar(500) COLLATE Modern_Spanish_CS_AI NOT NULL,
[Descripcion] varchar(1000) COLLATE Modern_Spanish_CS_AI NULL,
[Pregunta] varchar(500) COLLATE Modern_Spanish_CS_AS NOT NULL,
[Descripcion] varchar(1000) COLLATE Modern_Spanish_CS_AS NULL,
[EsRequerida] bit CONSTRAINT [DF_Tra_Preguntas_EsRequerida] DEFAULT ((0)) NOT NULL,
[Orden] int CONSTRAINT [DF_Tra_Preguntas_Orden] DEFAULT ((0)) NOT NULL,
[EsActivo] bit CONSTRAINT [DF_Tra_Preguntas_EsActivo] DEFAULT ((1)) NOT NULL,
@@ -154,8 +154,8 @@ GO
CREATE TABLE [dbo].[Tra_OpcionesPregunta] (
[CveOpcionPregunta] int IDENTITY(1,1) NOT NULL,
[CvePregunta] int NOT NULL,
[TextoOpcion] varchar(300) COLLATE Modern_Spanish_CS_AI NOT NULL,
[ValorOpcion] varchar(300) COLLATE Modern_Spanish_CS_AI NULL,
[TextoOpcion] varchar(300) COLLATE Modern_Spanish_CS_AS NOT NULL,
[ValorOpcion] varchar(300) COLLATE Modern_Spanish_CS_AS NULL,
[Orden] int CONSTRAINT [DF_Tra_OpcionesPregunta_Orden] DEFAULT ((0)) NOT NULL,
[EsActivo] bit CONSTRAINT [DF_Tra_OpcionesPregunta_EsActivo] DEFAULT ((1)) NOT NULL,
CONSTRAINT [PK_Tra_OpcionesPregunta] PRIMARY KEY CLUSTERED ([CveOpcionPregunta]),
@@ -167,7 +167,7 @@ GO
CREATE TABLE [dbo].[Tra_Solicitudes] (
[CveSolicitud] int IDENTITY(1,1) NOT NULL,
[Folio] varchar(50) COLLATE Modern_Spanish_CS_AI NOT NULL,
[Folio] varchar(50) COLLATE Modern_Spanish_CS_AS NOT NULL,
[CveCliente] int NOT NULL,
[CveFraccionamiento] int NOT NULL,
[CveFraccionamientoEtapa] int NOT NULL,
@@ -178,8 +178,8 @@ CREATE TABLE [dbo].[Tra_Solicitudes] (
[FechaEnvio] datetime NULL,
[FechaAutorizacion] datetime NULL,
[FechaRechazo] datetime NULL,
[ComentariosCliente] varchar(max) COLLATE Modern_Spanish_CS_AI NULL,
[ComentariosAdministrativos] varchar(max) COLLATE Modern_Spanish_CS_AI NULL,
[ComentariosCliente] varchar(max) COLLATE Modern_Spanish_CS_AS NULL,
[ComentariosAdministrativos] varchar(max) COLLATE Modern_Spanish_CS_AS NULL,
[FechaAlta] datetime CONSTRAINT [DF_Tra_Solicitudes_FechaAlta] DEFAULT (GETDATE()) NOT NULL,
[FechaModificacion] datetime NULL,
CONSTRAINT [PK_Tra_Solicitudes] PRIMARY KEY CLUSTERED ([CveSolicitud]),
@@ -193,7 +193,7 @@ CREATE TABLE [dbo].[Tra_SolicitudesDependencias] (
[CveSolicitud] int NOT NULL,
[CveSolicitudRequerida] int NOT NULL,
[EsObligatoria] bit CONSTRAINT [DF_Tra_SolicitudesDependencias_EsObligatoria] DEFAULT ((1)) NOT NULL,
[Condicion] varchar(500) COLLATE Modern_Spanish_CS_AI NULL,
[Condicion] varchar(500) COLLATE Modern_Spanish_CS_AS NULL,
[FechaAlta] datetime CONSTRAINT [DF_Tra_SolicitudesDependencias_FechaAlta] DEFAULT (GETDATE()) NOT NULL,
[CveUsuario] int NOT NULL,
CONSTRAINT [PK_Tra_SolicitudesDependencias] PRIMARY KEY CLUSTERED ([CveSolicitudDependencia]),
@@ -207,7 +207,7 @@ CREATE TABLE [dbo].[Tra_HistorialEstatusSolicitud] (
[CveSolicitud] int NOT NULL,
[CveEstatusSolicitud] int NOT NULL,
[CveUsuario] int NULL,
[Comentarios] varchar(1000) COLLATE Modern_Spanish_CS_AI NULL,
[Comentarios] varchar(1000) COLLATE Modern_Spanish_CS_AS NULL,
[FechaAlta] datetime CONSTRAINT [DF_Tra_HistorialEstatusSolicitud_FechaAlta] DEFAULT (GETDATE()) NOT NULL,
CONSTRAINT [PK_Tra_HistorialEstatusSolicitud] PRIMARY KEY CLUSTERED ([CveHistorialEstatusSolicitud])
);
@@ -229,13 +229,13 @@ CREATE TABLE [dbo].[Tra_DocumentosSolicitud] (
[CveDocumentoSolicitud] int IDENTITY(1,1) NOT NULL,
[CveSolicitud] int NOT NULL,
[CveTipoDocumento] int NOT NULL,
[NombreArchivo] varchar(255) COLLATE Modern_Spanish_CS_AI NOT NULL,
[NombreArchivoFisico] varchar(255) COLLATE Modern_Spanish_CS_AI NOT NULL,
[RutaArchivo] varchar(1000) COLLATE Modern_Spanish_CS_AI NOT NULL,
[ContentType] varchar(100) COLLATE Modern_Spanish_CS_AI NULL,
[NombreArchivo] varchar(255) COLLATE Modern_Spanish_CS_AS NOT NULL,
[NombreArchivoFisico] varchar(255) COLLATE Modern_Spanish_CS_AS NOT NULL,
[RutaArchivo] varchar(1000) COLLATE Modern_Spanish_CS_AS NOT NULL,
[ContentType] varchar(100) COLLATE Modern_Spanish_CS_AS NULL,
[TamanoBytes] bigint NULL,
[ComentarioCliente] varchar(1000) COLLATE Modern_Spanish_CS_AI NULL,
[ComentarioAdministrativo] varchar(1000) COLLATE Modern_Spanish_CS_AI NULL,
[ComentarioCliente] varchar(1000) COLLATE Modern_Spanish_CS_AS NULL,
[ComentarioAdministrativo] varchar(1000) COLLATE Modern_Spanish_CS_AS NULL,
[EsAprobado] bit NULL,
[CveUsuarioCarga] int NULL,
[CveUsuarioRevisa] int NULL,
@@ -263,7 +263,7 @@ CREATE TABLE [dbo].[Tra_RespuestasSolicitud] (
[CveSolicitud] int NOT NULL,
[CvePregunta] int NOT NULL,
[CveOpcionPregunta] int NULL,
[Valor] varchar(max) COLLATE Modern_Spanish_CS_AI NULL,
[Valor] varchar(max) COLLATE Modern_Spanish_CS_AS NULL,
[FechaAlta] datetime CONSTRAINT [DF_Tra_RespuestasSolicitud_FechaAlta] DEFAULT (GETDATE()) NOT NULL,
[FechaModificacion] datetime NULL,
[CveUsuario] int NULL,
@@ -277,7 +277,7 @@ CREATE TABLE [dbo].[Tra_CostosTramite] (
[CveTipoTramite] int NOT NULL,
[CvePS] int NOT NULL,
[CveMoneda] int NOT NULL,
[Descripcion] varchar(300) COLLATE Modern_Spanish_CS_AI NOT NULL,
[Descripcion] varchar(300) COLLATE Modern_Spanish_CS_AS NOT NULL,
[Importe] decimal(18,2) CONSTRAINT [DF_Tra_CostosTramite_Importe] DEFAULT ((0)) NOT NULL,
[FechaInicioVigencia] date NULL,
[FechaFinVigencia] date NULL,
@@ -296,8 +296,8 @@ CREATE TABLE [dbo].[Tra_NotasSolicitud] (
[CveNotaSolicitud] int IDENTITY(1,1) NOT NULL,
[CveSolicitud] int NOT NULL,
[CveUsuario] int NULL,
[TipoNota] varchar(50) COLLATE Modern_Spanish_CS_AI CONSTRAINT [DF_Tra_NotasSolicitud_TipoNota] DEFAULT ('General') NOT NULL,
[Comentario] varchar(max) COLLATE Modern_Spanish_CS_AI NOT NULL,
[TipoNota] varchar(50) COLLATE Modern_Spanish_CS_AS CONSTRAINT [DF_Tra_NotasSolicitud_TipoNota] DEFAULT ('General') NOT NULL,
[Comentario] varchar(max) COLLATE Modern_Spanish_CS_AS NOT NULL,
[EsVisibleParaCliente] bit CONSTRAINT [DF_Tra_NotasSolicitud_Visible] DEFAULT ((1)) NOT NULL,
[FechaAlta] datetime CONSTRAINT [DF_Tra_NotasSolicitud_FechaAlta] DEFAULT (GETDATE()) NOT NULL,
CONSTRAINT [PK_Tra_NotasSolicitud] PRIMARY KEY CLUSTERED ([CveNotaSolicitud])
@@ -336,7 +336,7 @@ CREATE TABLE [dbo].[Vta_Pagos] (
[CvePrePoliza] int NULL,
[FechaPago] datetime NOT NULL,
[Importe] decimal(18,2) NOT NULL,
[Referencia] varchar(200) COLLATE Modern_Spanish_CS_AI NULL,
[Referencia] varchar(200) COLLATE Modern_Spanish_CS_AS NULL,
[EsSaldoFavor] bit CONSTRAINT [DF_Vta_Pagos_EsSaldoFavor] DEFAULT ((0)) NOT NULL,
[EsActivo] bit CONSTRAINT [DF_Vta_Pagos_EsActivo] DEFAULT ((1)) NOT NULL,
[FechaAlta] datetime CONSTRAINT [DF_Vta_Pagos_FechaAlta] DEFAULT (GETDATE()) NOT NULL,

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,590 @@
CREATE OR ALTER PROCEDURE dbo.PA_Fac_EmisorFiscalGet
@CveEmpresa int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmpresa = @CveEmpresa
AND EsActivo = 1
)
BEGIN
SELECT
@ErrorMostrar = 'La empresa no tiene configurado un emisor fiscal activo.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
CveEmisorFiscal,
CveEmpresa,
Rfc,
NombreFiscal,
RegimenFiscal,
CodigoPostal,
ProveedorPac,
AmbienteProduccion,
ReferenciaCredencialPac,
ReferenciaContratoPac,
ReferenciaCertificadoCsd,
ReferenciaLlavePrivadaCsd,
NumeroCertificado,
VigenciaCertificadoDesde,
VigenciaCertificadoHasta,
HuellaCertificado,
EsActivo
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmpresa = @CveEmpresa
AND EsActivo = 1;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar el emisor fiscal; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_EmisorFiscalGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteVentaDatosCfdiGet
@CveSolicitud int,
@CveTramitePago int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
DECLARE @CveVenta int;
SELECT @CveVenta = V.CveVenta
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago;
IF @CveVenta IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Primero debe generar la venta del trámite.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Ventas AS V
WHERE V.CveVenta = @CveVenta
AND
(
V.SeTimbro = 1
OR EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos AS D
WHERE D.TipoOrigen = 'VENTA'
AND D.CveOrigen = V.CveVenta
AND D.Estado = 'TIMBRADO'
AND D.CveCfdiTimbradoVigente IS NOT NULL
)
)
)
BEGIN
SELECT
@ErrorMostrar = 'La venta ya se encuentra timbrada.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos
WHERE TipoOrigen = 'VENTA'
AND CveOrigen = @CveVenta
AND Estado = 'REVISAR'
)
BEGIN
SELECT
@ErrorMostrar = 'Existe un intento de timbrado con resultado indeterminado; debe revisarse antes de volver a timbrar.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
V.CveVenta,
Borrador.CveCfdiDocumento,
V.CveCliente,
V.Serie,
V.Folio,
V.Fecha,
FP.ClaveFormaPagoSAT AS FormaPago,
MP.ClaveMetodoPagoSAT AS MetodoPago,
M.AbreviaturaSAT AS Moneda,
CONVERT(decimal(19, 6), V.TipoCambio) AS TipoCambio
FROM dbo.Ventas AS V
LEFT JOIN dbo.Vta_FormaPago AS FP
ON FP.CveFormaPago = V.FormaPago
LEFT JOIN dbo.Vta_MetodoPago AS MP
ON MP.CveMetodoPago = V.CveMetodoPago
INNER JOIN dbo.Gral_Monedas AS M
ON M.CveMoneda = V.CveMoneda
OUTER APPLY
(
SELECT TOP (1) D.CveCfdiDocumento
FROM dbo.Fac_CfdiDocumentos AS D
WHERE D.TipoOrigen = 'VENTA'
AND D.CveOrigen = V.CveVenta
AND D.CveCfdiTimbradoVigente IS NULL
AND D.Estado IN ('BORRADOR', 'LISTO', 'ERROR')
ORDER BY D.CveCfdiDocumento DESC
) AS Borrador
WHERE V.CveVenta = @CveVenta;
SELECT
SATPS.SATClavePS AS ClaveProductoServicio,
PS.Codigo AS NumeroIdentificacion,
VD.Cantidad,
SATUM.SATClaveUnidadMedida AS ClaveUnidad,
UM.UnidadMedida AS Unidad,
PS.PS AS Descripcion,
VD.PrecioUnitario AS ValorUnitario,
VD.PrecioUnitario AS PU,
VD.Importe AS Total,
VD.Descuento,
OI.CodigoObjetoImpuesto AS ObjetoImpuesto,
CONVERT(
decimal(19, 6),
VD.Importe - VD.Descuento
) AS BaseIVA,
CONVERT(decimal(19, 6), 0.16) AS TasaIVA,
CONVERT(decimal(19, 6), VD.IVA) AS ImporteIVA,
CONVERT(decimal(19, 6), 0.16) AS PorcentajeIVA
FROM dbo.VentasDetalle AS VD
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = VD.CvePS
INNER JOIN dbo.UnidadesMedida AS UM
ON UM.CveUnidadMedida = PS.CveUnidadMedida
LEFT JOIN dbo.Gral_SAT_ProductosServicios AS SATPS
ON SATPS.CveSATPS = PS.CveSATPS
LEFT JOIN dbo.Gral_SAT_UnidadesMedida AS SATUM
ON SATUM.CveSATUnidadMedida = UM.CveSATUnidadMedida
LEFT JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI
ON OI.CveObjetoImpuesto = PS.CveObjetoImpuesto
WHERE VD.CveVenta = @CveVenta
ORDER BY VD.CveVentaDetalle;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al preparar los datos fiscales de la venta; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Vta_TramiteVentaDatosCfdiGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_EmisorFiscalSave
@CveEmisorFiscal int = NULL,
@CveEmpresa int,
@Rfc varchar(13),
@NombreFiscal varchar(300),
@RegimenFiscal varchar(3),
@CodigoPostal varchar(5),
@ProveedorPac varchar(50),
@AmbienteProduccion bit,
@ReferenciaCredencialPac varchar(100),
@ReferenciaContratoPac varchar(100) = NULL,
@ReferenciaCertificadoCsd varchar(500) = NULL,
@ReferenciaLlavePrivadaCsd varchar(500) = NULL,
@NumeroCertificado varchar(20) = NULL,
@VigenciaCertificadoDesde datetime2(0) = NULL,
@VigenciaCertificadoHasta datetime2(0) = NULL,
@HuellaCertificado varchar(128) = NULL,
@EsActivo bit,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SELECT
@Rfc = UPPER(REPLACE(LTRIM(RTRIM(@Rfc)), ' ', '')),
@NombreFiscal = LTRIM(RTRIM(@NombreFiscal)),
@RegimenFiscal = LTRIM(RTRIM(@RegimenFiscal)),
@CodigoPostal = LTRIM(RTRIM(@CodigoPostal)),
@ProveedorPac = UPPER(LTRIM(RTRIM(@ProveedorPac))),
@ReferenciaCredencialPac = LTRIM(RTRIM(@ReferenciaCredencialPac)),
@ReferenciaContratoPac = NULLIF(LTRIM(RTRIM(@ReferenciaContratoPac)), ''),
@ReferenciaCertificadoCsd = NULLIF(LTRIM(RTRIM(@ReferenciaCertificadoCsd)), ''),
@ReferenciaLlavePrivadaCsd = NULLIF(LTRIM(RTRIM(@ReferenciaLlavePrivadaCsd)), ''),
@NumeroCertificado = NULLIF(LTRIM(RTRIM(@NumeroCertificado)), ''),
@HuellaCertificado = NULLIF(LTRIM(RTRIM(@HuellaCertificado)), '');
IF LEN(@Rfc) NOT IN (12, 13)
OR NULLIF(@NombreFiscal, '') IS NULL
OR LEN(@RegimenFiscal) <> 3
OR LEN(@CodigoPostal) <> 5
OR NULLIF(@ProveedorPac, '') IS NULL
OR NULLIF(@ReferenciaCredencialPac, '') IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Capture RFC, nombre fiscal, régimen, código postal, PAC y referencia de credencial válidos.',
@ErrorTipo = 2;
RETURN;
END;
IF @CveEmisorFiscal IS NULL
BEGIN
IF EXISTS
(
SELECT 1
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmpresa = @CveEmpresa
)
BEGIN
SELECT
@ErrorMostrar = 'La empresa ya cuenta con una configuración fiscal.',
@ErrorTipo = 2;
RETURN;
END;
INSERT dbo.Fac_EmisoresFiscales
(
CveEmpresa,
Rfc,
NombreFiscal,
RegimenFiscal,
CodigoPostal,
ProveedorPac,
AmbienteProduccion,
ReferenciaCredencialPac,
ReferenciaContratoPac,
ReferenciaCertificadoCsd,
ReferenciaLlavePrivadaCsd,
NumeroCertificado,
VigenciaCertificadoDesde,
VigenciaCertificadoHasta,
HuellaCertificado,
EsActivo,
CveUsuario
)
VALUES
(
@CveEmpresa,
@Rfc,
@NombreFiscal,
@RegimenFiscal,
@CodigoPostal,
@ProveedorPac,
@AmbienteProduccion,
@ReferenciaCredencialPac,
@ReferenciaContratoPac,
@ReferenciaCertificadoCsd,
@ReferenciaLlavePrivadaCsd,
@NumeroCertificado,
@VigenciaCertificadoDesde,
@VigenciaCertificadoHasta,
@HuellaCertificado,
@EsActivo,
@CveUsuarioEjecuta
);
SET @CveEmisorFiscal = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmisorFiscal = @CveEmisorFiscal
AND CveEmpresa = @CveEmpresa
)
BEGIN
SELECT
@ErrorMostrar = 'No se encontró la configuración fiscal seleccionada.',
@ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Fac_EmisoresFiscales
SET Rfc = @Rfc,
NombreFiscal = @NombreFiscal,
RegimenFiscal = @RegimenFiscal,
CodigoPostal = @CodigoPostal,
ProveedorPac = @ProveedorPac,
AmbienteProduccion = @AmbienteProduccion,
ReferenciaCredencialPac = @ReferenciaCredencialPac,
ReferenciaContratoPac = @ReferenciaContratoPac,
ReferenciaCertificadoCsd = @ReferenciaCertificadoCsd,
ReferenciaLlavePrivadaCsd = @ReferenciaLlavePrivadaCsd,
NumeroCertificado = @NumeroCertificado,
VigenciaCertificadoDesde = @VigenciaCertificadoDesde,
VigenciaCertificadoHasta = @VigenciaCertificadoHasta,
HuellaCertificado = @HuellaCertificado,
EsActivo = @EsActivo,
FechaModificacion = SYSDATETIME(),
CveUsuario = @CveUsuarioEjecuta
WHERE CveEmisorFiscal = @CveEmisorFiscal;
END;
SELECT @CveEmisorFiscal AS CveEmisorFiscal;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al guardar el emisor fiscal; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_EmisorFiscalSave'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteContextoGet
@CveSolicitud int,
@CveTramitePago int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
DECLARE @CveSubProyecto int =
(
SELECT TOP (1) CveSubProyecto
FROM dbo.SubProyectos
WHERE Estatus = 1
ORDER BY
CASE WHEN Serie = 'TRA' THEN 0 ELSE 1 END,
CveSubProyecto
);
IF NOT EXISTS
(
SELECT 1
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = @CveTramitePago
AND P.CveTipoTramite = S.CveTipoTramite
AND P.EsActivo = 1
INNER JOIN dbo.Tra_PagosDetalle AS D
ON D.CveTramitePago = P.CveTramitePago
WHERE S.CveSolicitud = @CveSolicitud
)
BEGIN
SELECT
@ErrorMostrar = 'El pago seleccionado no corresponde al trámite o no tiene conceptos activos.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
S.CveSolicitud,
P.CveTramitePago,
SP.CveVenta,
VP.CvePago,
CONVERT(
bit,
CASE
WHEN SP.CveSolicitudPago IS NOT NULL
AND V.CveVenta IS NOT NULL
THEN 1
ELSE 0
END
) AS VentaGenerada,
CONVERT(
bit,
CASE WHEN VP.Autorizado = 1 THEN 1 ELSE 0 END
) AS VentaPagada,
CONVERT(
bit,
CASE
WHEN VP.CvePago IS NOT NULL
AND VP.Autorizado = 0
THEN 1
ELSE 0
END
) AS PagoPendienteAutorizacion,
VP.Referencia AS ReferenciaPago,
Documento.CveCfdiDocumento,
CONVERT(
bit,
CASE
WHEN V.SeTimbro = 1
OR Documento.Estado = 'TIMBRADO'
THEN 1
ELSE 0
END
) AS VentaTimbrada,
CONVERT(
bit,
CASE WHEN Documento.Estado = 'CANCELADO' THEN 1 ELSE 0 END
) AS TimbreCancelado,
Documento.Uuid AS UuidTimbre,
S.CveFraccionamiento,
F.Fraccionamiento,
F.CveCliente,
C.Nombre AS Cliente,
C.RFC,
CONCAT(
C.Direccion,
CASE
WHEN NULLIF(LTRIM(RTRIM(C.NoExt)), '') IS NULL
THEN ''
ELSE CONCAT(' ', C.NoExt)
END,
CASE
WHEN NULLIF(LTRIM(RTRIM(C.NoInt)), '') IS NULL
THEN ''
ELSE CONCAT(' Int. ', C.NoInt)
END
) AS Direccion,
C.Colonia,
CONCAT(C.Ciudad, ', ', C.Estado) AS CiudadEstado,
C.CP,
C.Telefono,
C.Mail,
S.Folio AS FolioSolicitud,
E.Etapa,
TT.TipoTramite,
P.Nombre AS NombrePago,
N'Remisión' AS TipoDocumento,
ISNULL(V.Serie, 'TRA') AS Serie,
ISNULL(
V.Folio,
ISNULL(
(
SELECT MAX(Venta.Folio) + 1
FROM dbo.Ventas AS Venta
WHERE Venta.TipoDocto = 'Rem'
AND Venta.Serie = 'TRA'
AND Venta.CveSubProyecto = @CveSubProyecto
),
1
)
) AS Folio,
ISNULL(V.Fecha, GETDATE()) AS Fecha,
ISNULL(V.CveMetodoPago33, ISNULL(V.CveMetodoPago, 2))
AS CveMetodoPago,
ISNULL(V.CveFormaPago33, ISNULL(V.FormaPago, 99))
AS CveFormaPago,
V.FechaVencimiento2 AS FechaVencimiento
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Fraccionamientos AS F
ON F.CveFraccionamiento = S.CveFraccionamiento
INNER JOIN dbo.FraccionamientosEtapas AS E
ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
INNER JOIN dbo.Tra_TiposTramite AS TT
ON TT.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = @CveTramitePago
AND P.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Clientes AS C
ON C.CveCliente = F.CveCliente
LEFT JOIN dbo.Tra_SolicitudesPagos AS SP
ON SP.CveSolicitud = S.CveSolicitud
AND SP.CveTramitePago = P.CveTramitePago
LEFT JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
OUTER APPLY
(
SELECT TOP (1)
Pago.CvePago,
Pago.Autorizado,
Pago.Referencia
FROM dbo.Vta_Pagos AS Pago
WHERE Pago.CveVenta = V.CveVenta
AND Pago.CveSolicitud = S.CveSolicitud
AND Pago.CveTramitePago = P.CveTramitePago
AND Pago.EsActivo = 1
ORDER BY Pago.CvePago DESC
) AS VP
OUTER APPLY
(
SELECT TOP (1)
D.CveCfdiDocumento,
D.Estado,
T.Uuid
FROM dbo.Fac_CfdiDocumentos AS D
LEFT JOIN dbo.Fac_CfdiTimbrados AS T
ON T.CveCfdiTimbrado = D.CveCfdiTimbradoVigente
WHERE D.TipoOrigen = 'VENTA'
AND D.CveOrigen = V.CveVenta
AND D.Estado IN ('TIMBRADO', 'CANCELADO')
ORDER BY D.CveCfdiDocumento DESC
) AS Documento
WHERE S.CveSolicitud = @CveSolicitud;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar la venta del trámite; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Vta_TramiteContextoGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,50 @@
SET NOCOUNT ON;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fraccionamientos_DetalleAvisosGet
@CveFraccionamiento int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
DECLARE @Avisos TABLE
(
TipoAviso varchar(50),
Aviso varchar(max)
);
SELECT
TipoAviso,
Aviso
FROM @Avisos;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar los avisos del fraccionamiento; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Fraccionamientos_DetalleAvisosGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO

652
Fraccionamientos_Lotes.sql Normal file
View File

@@ -0,0 +1,652 @@
/* Catálogo de lotes con borrado físico. Las definiciones se sincronizaron desde la base local. */
IF NOT EXISTS
(
SELECT 1
FROM sys.indexes
WHERE [object_id] = OBJECT_ID(N'dbo.FraccionamientosLotes')
AND [name] = N'IX_FraccionamientosLotes_Etapa'
)
BEGIN
CREATE NONCLUSTERED INDEX [IX_FraccionamientosLotes_Etapa]
ON [dbo].[FraccionamientosLotes] ([CveFraccionamientoEtapa])
INCLUDE
(
[Numero],
[Tipo],
[Calle],
[Catastro],
[MetrosCuadrados],
[Duplicador],
[EsActivo]
);
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_LoteList]
@CveFraccionamiento int,
@CveFraccionamientoEtapa int = NULL,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM [dbo].[Fraccionamientos]
WHERE [CveFraccionamiento] = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'El fraccionamiento seleccionado no existe.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @CveFraccionamientoEtapa IS NOT NULL
AND NOT EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosEtapas]
WHERE [CveFraccionamientoEtapa] = @CveFraccionamientoEtapa
AND [CveFraccionamiento] = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'La etapa seleccionada no pertenece al fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
SELECT
L.[CveFraccionamientoLote] AS [CveFraccionamientoLote],
E.[CveFraccionamientoEtapa] AS [CveFraccionamientoEtapa],
E.[Etapa] AS [Etapa],
L.[Numero] AS [Nombre],
L.[Tipo] AS [Tipo],
L.[Calle] AS [Calle],
L.[Catastro] AS [Catastro],
L.[MetrosCuadrados] AS [MetrosCuadrados],
L.[Duplicador] AS [Duplicador],
L.[EsActivo] AS [EsActivo]
FROM [dbo].[FraccionamientosLotes] AS L
INNER JOIN [dbo].[FraccionamientosEtapas] AS E
ON E.[CveFraccionamientoEtapa] = L.[CveFraccionamientoEtapa]
WHERE E.[CveFraccionamiento] = @CveFraccionamiento
AND (@CveFraccionamientoEtapa IS NULL
OR E.[CveFraccionamientoEtapa] = @CveFraccionamientoEtapa)
ORDER BY
E.[Orden],
E.[Etapa],
L.[Numero],
L.[CveFraccionamientoLote];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar los lotes; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fraccionamientos_LoteList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_LoteBatchSave]
@CveFraccionamiento int,
@CveFraccionamientoEtapa int,
@LotesXml xml,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosEtapas]
WHERE [CveFraccionamientoEtapa] = @CveFraccionamientoEtapa
AND [CveFraccionamiento] = @CveFraccionamiento
AND [EsActivo] = (1)
)
BEGIN
SET @ErrorMostrar = 'La etapa seleccionada no existe, está inactiva o no pertenece al fraccionamiento.';
SET @ErrorTipo = 1;
RETURN;
END;
DECLARE @Lotes TABLE
(
[Nombre] varchar(50) COLLATE Modern_Spanish_CS_AS NULL,
[Tipo] varchar(100) COLLATE Modern_Spanish_CS_AS NULL,
[Calle] varchar(200) COLLATE Modern_Spanish_CS_AS NULL,
[Catastro] varchar(100) COLLATE Modern_Spanish_CS_AS NULL,
[MetrosCuadrados] decimal(18,4) NULL,
[Duplicador] varchar(50) COLLATE Modern_Spanish_CS_AS NULL,
[EsActivo] bit NOT NULL
);
INSERT INTO @Lotes
(
[Nombre],
[Tipo],
[Calle],
[Catastro],
[MetrosCuadrados],
[Duplicador],
[EsActivo]
)
SELECT
NULLIF(LTRIM(RTRIM(N.value('@Nombre', 'varchar(50)'))), ''),
NULLIF(LTRIM(RTRIM(N.value('@Tipo', 'varchar(100)'))), ''),
NULLIF(LTRIM(RTRIM(N.value('@Calle', 'varchar(200)'))), ''),
NULLIF(LTRIM(RTRIM(N.value('@Catastro', 'varchar(100)'))), ''),
TRY_CONVERT(
decimal(18,4),
NULLIF(N.value('@MetrosCuadrados', 'varchar(50)'), '')
),
NULLIF(LTRIM(RTRIM(N.value('@Duplicador', 'varchar(50)'))), ''),
N.value('@EsActivo', 'bit')
FROM @LotesXml.nodes('/Lotes/Lote') AS X(N);
DECLARE @Cantidad int = (SELECT COUNT(1) FROM @Lotes);
IF @Cantidad = (0)
BEGIN
SET @ErrorMostrar = 'No se recibieron lotes para guardar.';
SET @ErrorTipo = 1;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM @Lotes
WHERE [Nombre] IS NULL
)
BEGIN
SET @ErrorMostrar = 'Todos los lotes deben tener un nombre.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT [Nombre]
FROM @Lotes
GROUP BY [Nombre]
HAVING COUNT(1) > (1)
)
BEGIN
SET @ErrorMostrar = 'La captura contiene nombres de lote repetidos.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM @Lotes AS N
INNER JOIN [dbo].[FraccionamientosLotes] AS L
ON L.[CveFraccionamientoEtapa] = @CveFraccionamientoEtapa
AND L.[Numero] = N.[Nombre]
)
BEGIN
SET @ErrorMostrar = 'Uno o más nombres de lote ya existen en la etapa seleccionada.';
SET @ErrorTipo = 2;
RETURN;
END;
DECLARE @LotesGuardados TABLE
(
CveFraccionamientoLote int NOT NULL,
CveFraccionamientoEtapa int NOT NULL,
Nombre varchar(50) COLLATE Modern_Spanish_CS_AS NULL,
Tipo varchar(100) COLLATE Modern_Spanish_CS_AS NULL,
Calle varchar(200) COLLATE Modern_Spanish_CS_AS NULL,
Catastro varchar(100) COLLATE Modern_Spanish_CS_AS NULL,
MetrosCuadrados decimal(18,4) NULL,
Duplicador varchar(50) COLLATE Modern_Spanish_CS_AS NULL,
EsActivo bit NOT NULL
);
INSERT INTO [dbo].[FraccionamientosLotes]
(
[CveFraccionamientoEtapa],
[Tipo],
[Calle],
[Catastro],
[MetrosCuadrados],
[Numero],
[Duplicador],
[EsActivo],
[CveUsuario]
)
OUTPUT
INSERTED.[CveFraccionamientoLote],
INSERTED.[CveFraccionamientoEtapa],
INSERTED.[Numero],
INSERTED.[Tipo],
INSERTED.[Calle],
INSERTED.[Catastro],
INSERTED.[MetrosCuadrados],
INSERTED.[Duplicador],
INSERTED.[EsActivo]
INTO @LotesGuardados
SELECT
@CveFraccionamientoEtapa,
[Tipo],
[Calle],
[Catastro],
[MetrosCuadrados],
[Nombre],
[Duplicador],
[EsActivo],
@CveUsuarioEjecuta
FROM @Lotes;
SELECT
G.CveFraccionamientoLote,
G.CveFraccionamientoEtapa,
@CveFraccionamiento AS CveFraccionamiento,
F.CveCliente,
G.Nombre,
G.Tipo,
G.Calle,
G.Catastro,
G.MetrosCuadrados,
G.Duplicador,
G.EsActivo
FROM @LotesGuardados AS G
INNER JOIN dbo.Fraccionamientos AS F
ON F.CveFraccionamiento = @CveFraccionamiento
ORDER BY G.CveFraccionamientoLote;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al guardar los lotes; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fraccionamientos_LoteBatchSave'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_LoteGet]
@CveFraccionamiento int,
@CveFraccionamientoLote int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosLotes] AS L
INNER JOIN [dbo].[FraccionamientosEtapas] AS E
ON E.[CveFraccionamientoEtapa] = L.[CveFraccionamientoEtapa]
WHERE L.[CveFraccionamientoLote] = @CveFraccionamientoLote
AND E.[CveFraccionamiento] = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'El lote seleccionado no existe o no pertenece al fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
SELECT
L.[CveFraccionamientoLote] AS [CveFraccionamientoLote],
L.[CveFraccionamientoEtapa] AS [CveFraccionamientoEtapa],
E.[CveFraccionamiento] AS [CveFraccionamiento],
F.[CveCliente] AS [CveCliente],
E.[Etapa] AS [Etapa],
L.[Numero] AS [Nombre],
L.[Tipo] AS [Tipo],
L.[Calle] AS [Calle],
L.[Catastro] AS [Catastro],
L.[MetrosCuadrados] AS [MetrosCuadrados],
L.[Duplicador] AS [Duplicador],
L.[EsActivo] AS [EsActivo]
FROM [dbo].[FraccionamientosLotes] AS L
INNER JOIN [dbo].[FraccionamientosEtapas] AS E
ON E.[CveFraccionamientoEtapa] = L.[CveFraccionamientoEtapa]
INNER JOIN [dbo].[Fraccionamientos] AS F
ON F.[CveFraccionamiento] = E.[CveFraccionamiento]
WHERE L.[CveFraccionamientoLote] = @CveFraccionamientoLote
AND E.[CveFraccionamiento] = @CveFraccionamiento
;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar el lote; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fraccionamientos_LoteGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_LoteUpdate]
@CveFraccionamiento int,
@CveFraccionamientoLote int,
@CveFraccionamientoEtapa int,
@Nombre varchar(50),
@Tipo varchar(100) = NULL,
@Calle varchar(200) = NULL,
@Catastro varchar(100) = NULL,
@MetrosCuadrados decimal(18,4) = NULL,
@Duplicador varchar(50) = NULL,
@EsActivo bit,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
SET @Nombre = NULLIF(LTRIM(RTRIM(@Nombre)), '');
SET @Tipo = NULLIF(LTRIM(RTRIM(@Tipo)), '');
SET @Calle = NULLIF(LTRIM(RTRIM(@Calle)), '');
SET @Catastro = NULLIF(LTRIM(RTRIM(@Catastro)), '');
SET @Duplicador = NULLIF(LTRIM(RTRIM(@Duplicador)), '');
IF @Nombre IS NULL
BEGIN
SET @ErrorMostrar = 'Capture el nombre del lote.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @MetrosCuadrados IS NOT NULL
AND @MetrosCuadrados < (0)
BEGIN
SET @ErrorMostrar = 'Los metros cuadrados no pueden ser negativos.';
SET @ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosEtapas]
WHERE [CveFraccionamientoEtapa] = @CveFraccionamientoEtapa
AND [CveFraccionamiento] = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'La etapa del lote no pertenece al fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosLotes] AS L
INNER JOIN [dbo].[FraccionamientosEtapas] AS E
ON E.[CveFraccionamientoEtapa] = L.[CveFraccionamientoEtapa]
WHERE L.[CveFraccionamientoLote] = @CveFraccionamientoLote
AND E.[CveFraccionamiento] = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'El lote seleccionado no existe o no pertenece al fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosLotes] AS L
WHERE L.[CveFraccionamientoEtapa] = @CveFraccionamientoEtapa
AND L.[CveFraccionamientoLote] <> @CveFraccionamientoLote
AND L.[Numero] = @Nombre COLLATE Modern_Spanish_CS_AS
)
BEGIN
SET @ErrorMostrar = 'Ya existe otro lote con ese nombre en la etapa.';
SET @ErrorTipo = 2;
RETURN;
END;
UPDATE [dbo].[FraccionamientosLotes]
SET
[CveFraccionamientoEtapa] = @CveFraccionamientoEtapa,
[Numero] = @Nombre,
[Tipo] = @Tipo,
[Calle] = @Calle,
[Catastro] = @Catastro,
[MetrosCuadrados] = @MetrosCuadrados,
[Duplicador] = @Duplicador,
[EsActivo] = @EsActivo,
[FechaModificacion] = SYSDATETIME(),
[CveUsuario] = @CveUsuarioEjecuta
WHERE [CveFraccionamientoLote] = @CveFraccionamientoLote
;
SELECT @CveFraccionamientoLote AS [CveFraccionamientoLote];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al actualizar el lote; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fraccionamientos_LoteUpdate'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_LoteDelete]
@CveFraccionamiento int,
@CveFraccionamientoLote int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosLotes] AS L
INNER JOIN [dbo].[FraccionamientosEtapas] AS E
ON E.[CveFraccionamientoEtapa] = L.[CveFraccionamientoEtapa]
WHERE L.[CveFraccionamientoLote] = @CveFraccionamientoLote
AND E.[CveFraccionamiento] = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'El lote seleccionado no existe o no pertenece al fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
DELETE FROM [dbo].[FraccionamientosLotes]
WHERE [CveFraccionamientoLote] = @CveFraccionamientoLote;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al eliminar el lote; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fraccionamientos_LoteDelete'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_LoteStageClear]
@CveFraccionamiento int,
@CveFraccionamientoEtapa int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM [dbo].[FraccionamientosEtapas]
WHERE [CveFraccionamientoEtapa] = @CveFraccionamientoEtapa
AND [CveFraccionamiento] = @CveFraccionamiento
)
BEGIN
SET @ErrorMostrar = 'La etapa seleccionada no pertenece al fraccionamiento.';
SET @ErrorTipo = 2;
RETURN;
END;
DELETE FROM [dbo].[FraccionamientosLotes]
WHERE [CveFraccionamientoEtapa] = @CveFraccionamientoEtapa;
DECLARE @Cantidad int = @@ROWCOUNT;
IF @Cantidad = (0)
BEGIN
SET @ErrorMostrar = 'La etapa seleccionada no tiene lotes para eliminar.';
SET @ErrorTipo = 2;
RETURN;
END;
SELECT @Cantidad AS [LotesEliminados];
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al eliminar los lotes de la etapa; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fraccionamientos_LoteStageClear'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,742 @@
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET NOCOUNT ON;
GO
UPDATE dbo.Vta_TipoDocumentos
SET TipoDocumento = N'Remisión'
WHERE CveTipoDocumento = 'Rem'
AND TipoDocumento <> N'Remisión';
GO
DECLARE @CveUsuarioSistema int =
(
SELECT TOP (1)
CveUsuario
FROM dbo.Sis_Usuarios
WHERE Activo = 1
ORDER BY CveUsuario
);
IF NOT EXISTS
(
SELECT 1
FROM dbo.Vta_FormaPago
WHERE CveFormaPago = 99
)
BEGIN
INSERT INTO dbo.Vta_FormaPago
(
CveFormaPago,
FormaPago,
ClaveFormaPagoSAT,
CveUsuario,
FechaIng
)
VALUES
(
99,
'Por definir',
'99',
@CveUsuarioSistema,
CONVERT(date, GETDATE())
);
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Vta_MetodoPago
WHERE CveMetodoPago = 2
)
BEGIN
INSERT INTO dbo.Vta_MetodoPago
(
CveMetodoPago,
MetodoPago,
ClaveMetodoPagoSAT,
CveUsuario,
FechaIng
)
VALUES
(
2,
'Pago en parcialidades o diferido',
'PPD',
@CveUsuarioSistema,
CONVERT(date, GETDATE())
);
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Vta_Pagos')
AND name = 'UX_Vta_Pagos_SolicitudTramitePagoActivo'
)
BEGIN
CREATE UNIQUE NONCLUSTERED INDEX UX_Vta_Pagos_SolicitudTramitePagoActivo
ON dbo.Vta_Pagos
(
CveSolicitud,
CveTramitePago
)
WHERE EsActivo = 1
AND CveSolicitud IS NOT NULL;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_FraccionamientoPagoPendienteList
@CveFraccionamiento int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
DECLARE @PorcentajeIVA decimal(9, 6) = 0.16;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fraccionamientos
WHERE CveFraccionamiento = @CveFraccionamiento
)
BEGIN
SELECT
@ErrorMostrar = 'El fraccionamiento solicitado no existe.',
@ErrorTipo = 2;
RETURN;
END;
;WITH Conceptos AS
(
SELECT
S.CveSolicitud,
P.CveTramitePago,
COUNT_BIG(*) AS NumeroConceptos,
SUM(
ROUND(
CONVERT(decimal(18, 4), Costo.Importe),
2
)
) AS SubTotal,
SUM(
ROUND(
CONVERT(decimal(18, 4), Costo.Importe) *
@PorcentajeIVA,
2
)
) AS IVA
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTipoTramite = S.CveTipoTramite
AND P.EsActivo = 1
INNER JOIN dbo.Tra_PagosDetalle AS D
ON D.CveTramitePago = P.CveTramitePago
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = D.CvePS
OUTER APPLY
(
SELECT TOP (1)
CT.Importe
FROM dbo.Tra_CostosTramite AS CT
WHERE CT.CveTipoTramite = S.CveTipoTramite
AND CT.CvePS = D.CvePS
AND CT.EsActivo = 1
AND
(
CT.FechaInicioVigencia IS NULL
OR CT.FechaInicioVigencia <= CONVERT(date, GETDATE())
)
AND
(
CT.FechaFinVigencia IS NULL
OR CT.FechaFinVigencia >= CONVERT(date, GETDATE())
)
ORDER BY
ISNULL(
CT.FechaInicioVigencia,
CONVERT(date, '19000101')) DESC,
CT.CveCostoTramite DESC
) AS Costo
WHERE S.CveFraccionamiento = @CveFraccionamiento
GROUP BY
S.CveSolicitud,
P.CveTramitePago
)
SELECT
S.CveSolicitud,
P.CveTramitePago,
SP.CveVenta,
CONVERT(
bit,
CASE
WHEN SP.CveSolicitudPago IS NOT NULL
AND V.CveVenta IS NOT NULL THEN 1
ELSE 0
END
) AS VentaGenerada,
S.Folio AS FolioSolicitud,
E.Etapa,
TT.TipoTramite,
P.Nombre AS NombrePago,
CONVERT(int, C.NumeroConceptos) AS NumeroConceptos,
CONVERT(
decimal(18, 2),
CASE
WHEN V.CveVenta IS NULL THEN C.SubTotal
ELSE V.SubTotal
END
) AS SubTotal,
CONVERT(
decimal(18, 2),
CASE
WHEN V.CveVenta IS NULL THEN C.IVA
ELSE V.IVA
END
) AS IVA,
CONVERT(
decimal(18, 2),
CASE
WHEN V.CveVenta IS NULL THEN C.SubTotal + C.IVA
ELSE V.Total
END
) AS Total
FROM Conceptos AS C
INNER JOIN dbo.Tra_Solicitudes AS S
ON S.CveSolicitud = C.CveSolicitud
INNER JOIN dbo.FraccionamientosEtapas AS E
ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
INNER JOIN dbo.Tra_TiposTramite AS TT
ON TT.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = C.CveTramitePago
LEFT JOIN dbo.Tra_SolicitudesPagos AS SP
ON SP.CveSolicitud = S.CveSolicitud
AND SP.CveTramitePago = P.CveTramitePago
LEFT JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Vta_Pagos AS VP
WHERE VP.CveSolicitud = S.CveSolicitud
AND VP.CveTramitePago = P.CveTramitePago
AND VP.CveVenta = SP.CveVenta
AND VP.EsActivo = 1
)
ORDER BY
E.Orden,
S.CveSolicitud,
P.Orden,
P.CveTramitePago;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar los pagos pendientes; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_FraccionamientoPagoPendienteList'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_FraccionamientoPagoRealizadoList
@CveFraccionamiento int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fraccionamientos
WHERE CveFraccionamiento = @CveFraccionamiento
)
BEGIN
SELECT
@ErrorMostrar = 'El fraccionamiento solicitado no existe.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
SP.CveSolicitudPago,
SP.CveSolicitud,
SP.CveTramitePago,
V.CveVenta,
VP.CvePago,
V.SerieFolio,
V.Fecha,
VP.FechaPago,
VP.Referencia,
S.Folio AS FolioSolicitud,
E.Etapa,
TT.TipoTramite,
P.Nombre AS NombrePago,
CONVERT(decimal(18, 2), V.SubTotal) AS SubTotal,
CONVERT(decimal(18, 2), V.IVA) AS IVA,
CONVERT(decimal(18, 2), VP.Importe) AS Total
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Tra_Solicitudes AS S
ON S.CveSolicitud = SP.CveSolicitud
INNER JOIN dbo.FraccionamientosEtapas AS E
ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
INNER JOIN dbo.Tra_TiposTramite AS TT
ON TT.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = SP.CveTramitePago
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
INNER JOIN dbo.Vta_Pagos AS VP
ON VP.CveVenta = V.CveVenta
AND VP.CveSolicitud = SP.CveSolicitud
AND VP.CveTramitePago = SP.CveTramitePago
AND VP.EsActivo = 1
WHERE S.CveFraccionamiento = @CveFraccionamiento
ORDER BY
VP.FechaPago DESC,
VP.CvePago DESC;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar los pagos realizados; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_FraccionamientoPagoRealizadoList'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteContextoGet
@CveSolicitud int,
@CveTramitePago int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
DECLARE @CveSubProyecto int =
(
SELECT TOP (1)
CveSubProyecto
FROM dbo.SubProyectos
WHERE Estatus = 1
ORDER BY
CASE WHEN Serie = 'TRA' THEN 0 ELSE 1 END,
CveSubProyecto
);
IF NOT EXISTS
(
SELECT 1
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = @CveTramitePago
AND P.CveTipoTramite = S.CveTipoTramite
AND P.EsActivo = 1
INNER JOIN dbo.Tra_PagosDetalle AS D
ON D.CveTramitePago = P.CveTramitePago
WHERE S.CveSolicitud = @CveSolicitud
)
BEGIN
SELECT
@ErrorMostrar = 'El pago seleccionado no corresponde al trámite o no tiene conceptos activos.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
S.CveSolicitud,
P.CveTramitePago,
SP.CveVenta,
VP.CvePago,
CONVERT(
bit,
CASE
WHEN SP.CveSolicitudPago IS NOT NULL
AND V.CveVenta IS NOT NULL THEN 1
ELSE 0
END
) AS VentaGenerada,
CONVERT(
bit,
CASE
WHEN VP.Autorizado = 1 THEN 1
ELSE 0
END
) AS VentaPagada,
CONVERT(
bit,
CASE
WHEN VP.CvePago IS NOT NULL
AND VP.Autorizado = 0
THEN 1
ELSE 0
END
) AS PagoPendienteAutorizacion,
VP.Referencia AS ReferenciaPago,
S.CveFraccionamiento,
F.Fraccionamiento,
F.CveCliente,
C.Nombre AS Cliente,
C.RFC,
CONCAT(
C.Direccion,
CASE
WHEN NULLIF(LTRIM(RTRIM(C.NoExt)), '') IS NULL THEN ''
ELSE CONCAT(' ', C.NoExt)
END,
CASE
WHEN NULLIF(LTRIM(RTRIM(C.NoInt)), '') IS NULL THEN ''
ELSE CONCAT(' Int. ', C.NoInt)
END
) AS Direccion,
C.Colonia,
CONCAT(C.Ciudad, ', ', C.Estado) AS CiudadEstado,
C.CP,
C.Telefono,
C.Mail,
S.Folio AS FolioSolicitud,
E.Etapa,
TT.TipoTramite,
P.Nombre AS NombrePago,
N'Remisión' AS TipoDocumento,
ISNULL(V.Serie, 'TRA') AS Serie,
ISNULL(
V.Folio,
ISNULL(
(
SELECT MAX(Venta.Folio) + 1
FROM dbo.Ventas AS Venta
WHERE Venta.TipoDocto = 'Rem'
AND Venta.Serie = 'TRA'
AND Venta.CveSubProyecto = @CveSubProyecto
),
1
)
) AS Folio,
ISNULL(V.Fecha, GETDATE()) AS Fecha,
ISNULL(V.CveMetodoPago33, ISNULL(V.CveMetodoPago, 2))
AS CveMetodoPago,
ISNULL(V.CveFormaPago33, ISNULL(V.FormaPago, 99))
AS CveFormaPago,
V.FechaVencimiento2 AS FechaVencimiento
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Fraccionamientos AS F
ON F.CveFraccionamiento = S.CveFraccionamiento
INNER JOIN dbo.FraccionamientosEtapas AS E
ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
INNER JOIN dbo.Tra_TiposTramite AS TT
ON TT.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = @CveTramitePago
AND P.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Clientes AS C
ON C.CveCliente = F.CveCliente
LEFT JOIN dbo.Tra_SolicitudesPagos AS SP
ON SP.CveSolicitud = S.CveSolicitud
AND SP.CveTramitePago = P.CveTramitePago
LEFT JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
OUTER APPLY
(
SELECT TOP (1)
Pago.CvePago,
Pago.Autorizado,
Pago.Referencia
FROM dbo.Vta_Pagos AS Pago
WHERE Pago.CveVenta = V.CveVenta
AND Pago.CveSolicitud = S.CveSolicitud
AND Pago.CveTramitePago = P.CveTramitePago
AND Pago.EsActivo = 1
ORDER BY Pago.CvePago DESC
) AS VP
WHERE S.CveSolicitud = @CveSolicitud;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar la venta del trámite; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_TramiteContextoGet'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramitePagoSave
@CveSolicitud int,
@CveTramitePago int,
@Referencia varchar(200) = NULL,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
DECLARE
@CveVenta int,
@CveCliente int,
@Importe decimal(18, 2),
@CvePago int,
@FechaPago datetime = GETDATE();
SELECT
@CveVenta = V.CveVenta,
@CveCliente = V.CveCliente,
@Importe = CONVERT(decimal(18, 2), V.Total)
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago;
IF @CveVenta IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Primero debe generar la venta del trámite.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Vta_Pagos WITH (UPDLOCK, HOLDLOCK)
WHERE CveSolicitud = @CveSolicitud
AND CveTramitePago = @CveTramitePago
AND CveVenta = @CveVenta
AND EsActivo = 1
)
BEGIN
SELECT
@ErrorMostrar = 'La venta del trámite ya se encuentra pagada.',
@ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Vta_FormaPago
WHERE CveFormaPago = 99
)
BEGIN
SELECT
@ErrorMostrar = 'La forma de pago por definir no está configurada; favor de contactar a Sistemas.',
@ErrorTipo = 2;
RETURN;
END;
INSERT INTO dbo.Vta_Pagos
(
CveCliente,
CveVenta,
CveSolicitud,
CveFormaPago,
CveMoneda,
CvePrePoliza,
FechaPago,
Importe,
Referencia,
EsSaldoFavor,
EsActivo,
FechaAlta,
CveUsuario,
CveTramitePago
)
VALUES
(
@CveCliente,
@CveVenta,
@CveSolicitud,
99,
1,
NULL,
@FechaPago,
@Importe,
NULLIF(LTRIM(RTRIM(@Referencia)), ''),
0,
1,
@FechaPago,
@CveUsuarioEjecuta,
@CveTramitePago
);
SET @CvePago = CONVERT(int, SCOPE_IDENTITY());
UPDATE dbo.Ventas
SET
CveMetodoPago = 2,
FormaPago = 99,
CveFormaPago33 = 99,
CveMetodoPago33 = 2,
FechaCobranza = @FechaPago,
CveUsuarioCobranza = @CveUsuarioEjecuta
WHERE CveVenta = @CveVenta;
SELECT @CvePago AS CvePago;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al registrar el pago de la venta; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_TramitePagoSave'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteVentaGenerar
@CveSolicitud int,
@CveTramitePago int,
@Observaciones varchar(2000) = NULL,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF EXISTS
(
SELECT 1
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago
)
BEGIN
SELECT
@ErrorMostrar = 'La venta del trámite ya fue generada.',
@ErrorTipo = 2;
RETURN;
END;
EXEC dbo.PA_Vta_TramiteVentaSave
@CveSolicitud = @CveSolicitud,
@CveTramitePago = @CveTramitePago,
@Observaciones = @Observaciones,
@CveUsuarioEjecuta = @CveUsuarioEjecuta,
@ErrorMostrar = @ErrorMostrar OUTPUT,
@ErrorTipo = @ErrorTipo OUTPUT,
@Return = @Return OUTPUT;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al generar la venta del trámite; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_TramiteVentaGenerar'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO

View File

@@ -0,0 +1,826 @@
SET NOCOUNT ON;
GO
DECLARE @CveUsuarioCatalogoPago int =
(
SELECT TOP (1) CveUsuario
FROM dbo.Sis_Usuarios
WHERE Activo = 1
ORDER BY CveUsuario
);
IF NOT EXISTS
(
SELECT 1
FROM dbo.Vta_FormaPago
WHERE ClaveFormaPagoSAT = '01'
)
BEGIN
INSERT INTO dbo.Vta_FormaPago
(
CveFormaPago,
FormaPago,
ClaveFormaPagoSAT,
CveUsuario,
FechaIng
)
VALUES
(
1,
'Efectivo',
'01',
@CveUsuarioCatalogoPago,
CONVERT(date, GETDATE())
);
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Vta_FormaPago
WHERE ClaveFormaPagoSAT = '03'
)
BEGIN
INSERT INTO dbo.Vta_FormaPago
(
CveFormaPago,
FormaPago,
ClaveFormaPagoSAT,
CveUsuario,
FechaIng
)
VALUES
(
3,
'Transferencia electrónica de fondos',
'03',
@CveUsuarioCatalogoPago,
CONVERT(date, GETDATE())
);
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Vta_FormaPago
WHERE ClaveFormaPagoSAT = '04'
)
BEGIN
INSERT INTO dbo.Vta_FormaPago
(
CveFormaPago,
FormaPago,
ClaveFormaPagoSAT,
CveUsuario,
FechaIng
)
VALUES
(
4,
'Tarjeta de crédito',
'04',
@CveUsuarioCatalogoPago,
CONVERT(date, GETDATE())
);
END;
GO
UPDATE V
SET
CveMetodoPago = ISNULL(V.CveMetodoPago, 2),
CveMetodoPago33 = ISNULL(V.CveMetodoPago33, 2),
FormaPago = ISNULL(V.FormaPago, 99),
CveFormaPago33 = ISNULL(V.CveFormaPago33, 99),
FechaVencimiento2 = ISNULL(
V.FechaVencimiento2,
CONVERT(date, V.Fecha)
)
FROM dbo.Ventas AS V
INNER JOIN dbo.Tra_SolicitudesPagos AS SP
ON SP.CveVenta = V.CveVenta
WHERE V.CveMetodoPago IS NULL
OR V.CveMetodoPago33 IS NULL
OR V.FormaPago IS NULL
OR V.CveFormaPago33 IS NULL
OR V.FechaVencimiento2 IS NULL;
GO
IF COL_LENGTH('dbo.Vta_Pagos', 'CveBancoCuenta') IS NULL
BEGIN
ALTER TABLE dbo.Vta_Pagos
ADD CveBancoCuenta int NULL;
END;
GO
IF COL_LENGTH('dbo.Vta_Pagos', 'Observaciones') IS NULL
BEGIN
ALTER TABLE dbo.Vta_Pagos
ADD Observaciones varchar(300) COLLATE Modern_Spanish_CS_AS NULL;
END;
GO
IF COL_LENGTH('dbo.Vta_Pagos', 'Autorizado') IS NULL
BEGIN
ALTER TABLE dbo.Vta_Pagos
ADD Autorizado bit NOT NULL
CONSTRAINT DF_Vta_Pagos_Autorizado DEFAULT (0) WITH VALUES;
END;
GO
IF COL_LENGTH('dbo.Vta_Pagos', 'FechaAutorizacion') IS NULL
BEGIN
ALTER TABLE dbo.Vta_Pagos
ADD FechaAutorizacion datetime NULL;
END;
GO
IF COL_LENGTH('dbo.Vta_Pagos', 'CveUsuarioAutoriza') IS NULL
BEGIN
ALTER TABLE dbo.Vta_Pagos
ADD CveUsuarioAutoriza int NULL;
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.foreign_keys
WHERE parent_object_id = OBJECT_ID('dbo.Vta_Pagos')
AND name = 'FK_Vta_Pagos_Banc_BancosCuentas'
)
BEGIN
ALTER TABLE dbo.Vta_Pagos WITH CHECK
ADD CONSTRAINT FK_Vta_Pagos_Banc_BancosCuentas
FOREIGN KEY (CveBancoCuenta)
REFERENCES dbo.Banc_BancosCuentas (CveBancoCuenta);
ALTER TABLE dbo.Vta_Pagos
CHECK CONSTRAINT FK_Vta_Pagos_Banc_BancosCuentas;
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.foreign_keys
WHERE parent_object_id = OBJECT_ID('dbo.Vta_Pagos')
AND name = 'FK_Vta_Pagos_Sis_Usuarios_Autoriza'
)
BEGIN
ALTER TABLE dbo.Vta_Pagos WITH CHECK
ADD CONSTRAINT FK_Vta_Pagos_Sis_Usuarios_Autoriza
FOREIGN KEY (CveUsuarioAutoriza)
REFERENCES dbo.Sis_Usuarios (CveUsuario);
ALTER TABLE dbo.Vta_Pagos
CHECK CONSTRAINT FK_Vta_Pagos_Sis_Usuarios_Autoriza;
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID('dbo.Vta_Pagos')
AND name = 'CK_Vta_Pagos_Autorizacion'
)
BEGIN
ALTER TABLE dbo.Vta_Pagos WITH CHECK
ADD CONSTRAINT CK_Vta_Pagos_Autorizacion
CHECK
(
(
Autorizado = 0
AND FechaAutorizacion IS NULL
AND CveUsuarioAutoriza IS NULL
)
OR
(
Autorizado = 1
AND FechaAutorizacion IS NOT NULL
AND CveUsuarioAutoriza IS NOT NULL
)
);
ALTER TABLE dbo.Vta_Pagos
CHECK CONSTRAINT CK_Vta_Pagos_Autorizacion;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramitePagoOpcionesList
@CveSolicitud int,
@CveTramitePago int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
DECLARE @CveVenta int;
SELECT @CveVenta = V.CveVenta
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago;
IF @CveVenta IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Primero debe generar la venta del trámite.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
@CveVenta AS CveVenta,
CONCAT(
'TRA-',
RIGHT(
REPLICATE('0', 10) +
CONVERT(varchar(10), @CveVenta),
10
)
) AS ReferenciaPago;
SELECT
FP.CveFormaPago,
FP.ClaveFormaPagoSAT,
CASE
WHEN NULLIF(LTRIM(RTRIM(FP.ClaveFormaPagoSAT)), '') IS NULL
THEN FP.FormaPago
ELSE
FP.ClaveFormaPagoSAT COLLATE Modern_Spanish_CS_AS
+ ' - '
+ FP.FormaPago COLLATE Modern_Spanish_CS_AS
END AS FormaPago,
CONVERT(
bit,
CASE
WHEN FP.ClaveFormaPagoSAT = '04' THEN 0
ELSE 1
END
) AS Disponible
FROM dbo.Vta_FormaPago AS FP
WHERE FP.ClaveFormaPagoSAT IN ('01', '03', '04')
ORDER BY
FP.ClaveFormaPagoSAT COLLATE Modern_Spanish_CS_AS,
FP.FormaPago COLLATE Modern_Spanish_CS_AS,
FP.CveFormaPago;
SELECT
BC.CveBancoCuenta,
B.Banco,
BC.NumCuenta AS NumeroCuenta,
BC.CLABE,
B.Banco COLLATE Modern_Spanish_CS_AS
+ ' - '
+ BC.NumCuenta COLLATE Modern_Spanish_CS_AS
+ CASE
WHEN NULLIF(LTRIM(RTRIM(BC.CLABE)), '') IS NULL
THEN ''
ELSE
' (CLABE '
+ BC.CLABE COLLATE Modern_Spanish_CS_AS
+ ')'
END AS CuentaBancaria
FROM dbo.Banc_BancosCuentas AS BC
INNER JOIN dbo.Banc_Bancos AS B
ON B.CveBanco = BC.CveBanco
WHERE BC.Estatus = 1
AND B.Estatus = 1
AND NULLIF(LTRIM(RTRIM(BC.CLABE)), '') IS NOT NULL
ORDER BY
B.Banco COLLATE Modern_Spanish_CS_AS,
BC.NumCuenta COLLATE Modern_Spanish_CS_AS,
BC.CveBancoCuenta;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar las opciones de pago; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_TramitePagoOpcionesList'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramitePagoSave
@CveSolicitud int,
@CveTramitePago int,
@Importe decimal(18, 2),
@FechaPago datetime,
@CveFormaPago tinyint,
@CveBancoCuenta int = NULL,
@Observaciones varchar(300) = NULL,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
DECLARE
@CveVenta int,
@CveCliente int,
@TotalVenta decimal(18, 2),
@CvePago int,
@ClaveFormaPagoSAT varchar(2),
@Referencia varchar(200);
SELECT
@CveVenta = V.CveVenta,
@CveCliente = V.CveCliente,
@TotalVenta = CONVERT(decimal(18, 2), V.Total)
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago;
IF @CveVenta IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Primero debe generar la venta del trámite.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Vta_Pagos WITH (UPDLOCK, HOLDLOCK)
WHERE CveSolicitud = @CveSolicitud
AND CveTramitePago = @CveTramitePago
AND CveVenta = @CveVenta
AND EsActivo = 1
)
BEGIN
SELECT
@ErrorMostrar = 'Ya existe una solicitud de pago activa para esta venta.',
@ErrorTipo = 2;
RETURN;
END;
IF @Importe IS NULL OR @Importe <= 0
BEGIN
SELECT
@ErrorMostrar = 'Capture un monto de pago mayor que cero.',
@ErrorTipo = 2;
RETURN;
END;
IF @Importe <> @TotalVenta
BEGIN
SELECT
@ErrorMostrar = CONCAT(
'El pago debe cubrir el saldo completo de ',
FORMAT(@TotalVenta, 'C', 'es-MX'),
'.'
),
@ErrorTipo = 2;
RETURN;
END;
IF @FechaPago IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Capture la fecha del pago.',
@ErrorTipo = 2;
RETURN;
END;
SELECT @ClaveFormaPagoSAT = ClaveFormaPagoSAT
FROM dbo.Vta_FormaPago
WHERE CveFormaPago = @CveFormaPago;
IF @ClaveFormaPagoSAT IS NULL
OR @ClaveFormaPagoSAT NOT IN ('01', '03', '04')
BEGIN
SELECT
@ErrorMostrar = 'Seleccione una forma de pago válida.',
@ErrorTipo = 2;
RETURN;
END;
IF @ClaveFormaPagoSAT = '04'
BEGIN
SELECT
@ErrorMostrar = 'El pago con tarjeta todavía no está disponible.',
@ErrorTipo = 2;
RETURN;
END;
IF @ClaveFormaPagoSAT = '03'
AND @CveBancoCuenta IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Seleccione la cuenta SPEI donde se recibirá la transferencia.',
@ErrorTipo = 2;
RETURN;
END;
IF @ClaveFormaPagoSAT = '01'
BEGIN
SET @CveBancoCuenta = NULL;
END;
IF @CveBancoCuenta IS NOT NULL
AND NOT EXISTS
(
SELECT 1
FROM dbo.Banc_BancosCuentas AS BC
INNER JOIN dbo.Banc_Bancos AS B
ON B.CveBanco = BC.CveBanco
WHERE BC.CveBancoCuenta = @CveBancoCuenta
AND BC.Estatus = 1
AND B.Estatus = 1
AND NULLIF(LTRIM(RTRIM(BC.CLABE)), '') IS NOT NULL
)
BEGIN
SELECT
@ErrorMostrar = 'Seleccione una cuenta bancaria activa.',
@ErrorTipo = 2;
RETURN;
END;
SET @Referencia = CONCAT(
'TRA-',
RIGHT(
REPLICATE('0', 10) +
CONVERT(varchar(10), @CveVenta),
10
)
);
INSERT INTO dbo.Vta_Pagos
(
CveCliente,
CveVenta,
CveSolicitud,
CveFormaPago,
CveMoneda,
CvePrePoliza,
FechaPago,
Importe,
Referencia,
EsSaldoFavor,
EsActivo,
FechaAlta,
CveUsuario,
CveTramitePago,
CveBancoCuenta,
Observaciones,
Autorizado,
FechaAutorizacion,
CveUsuarioAutoriza
)
VALUES
(
@CveCliente,
@CveVenta,
@CveSolicitud,
@CveFormaPago,
1,
NULL,
@FechaPago,
@Importe,
@Referencia,
0,
1,
GETDATE(),
@CveUsuarioEjecuta,
@CveTramitePago,
@CveBancoCuenta,
NULLIF(LTRIM(RTRIM(@Observaciones)), ''),
0,
NULL,
NULL
);
SET @CvePago = CONVERT(int, SCOPE_IDENTITY());
SELECT
@CvePago AS CvePago,
@Referencia AS Referencia,
CONVERT(bit, 0) AS Autorizado;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al registrar el pago de la venta; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_TramitePagoSave'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteCondicionesPagoOpcionesList
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
SELECT
MP.CveMetodoPago,
MP.MetodoPago,
MP.ClaveMetodoPagoSAT,
MP.ClaveMetodoPagoSAT COLLATE Modern_Spanish_CS_AS
+ ' - '
+ MP.MetodoPago COLLATE Modern_Spanish_CS_AS AS Descripcion
FROM dbo.Vta_MetodoPago AS MP
ORDER BY MP.ClaveMetodoPagoSAT, MP.CveMetodoPago;
SELECT
FP.CveFormaPago,
FP.ClaveFormaPagoSAT,
FP.ClaveFormaPagoSAT COLLATE Modern_Spanish_CS_AS
+ ' - '
+ FP.FormaPago COLLATE Modern_Spanish_CS_AS AS FormaPago,
CONVERT(bit, 1) AS Disponible
FROM dbo.Vta_FormaPago AS FP
ORDER BY FP.ClaveFormaPagoSAT, FP.CveFormaPago;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar las condiciones de pago; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_TramiteCondicionesPagoOpcionesList'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteCondicionesPagoSave
@CveSolicitud int,
@CveTramitePago int,
@CveMetodoPago int,
@CveFormaPago tinyint,
@FechaVencimiento date,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
DECLARE @CveVenta int;
SELECT @CveVenta = V.CveVenta
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago;
IF @CveVenta IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Primero debe generar la venta del trámite.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Ventas
WHERE CveVenta = @CveVenta
AND SeTimbro = 1
)
BEGIN
SELECT
@ErrorMostrar = 'Las condiciones de una venta timbrada no se pueden modificar.',
@ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Vta_MetodoPago
WHERE CveMetodoPago = @CveMetodoPago
)
BEGIN
SELECT
@ErrorMostrar = 'Seleccione un método de pago válido.',
@ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Vta_FormaPago
WHERE CveFormaPago = @CveFormaPago
)
BEGIN
SELECT
@ErrorMostrar = 'Seleccione una forma de pago válida.',
@ErrorTipo = 2;
RETURN;
END;
IF @FechaVencimiento IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Capture una fecha de vencimiento válida.',
@ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Ventas
SET
CveMetodoPago = @CveMetodoPago,
CveMetodoPago33 = @CveMetodoPago,
FormaPago = @CveFormaPago,
CveFormaPago33 = @CveFormaPago,
FechaVencimiento2 = @FechaVencimiento,
CveUsuarioModifico = @CveUsuarioEjecuta
WHERE CveVenta = @CveVenta;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al actualizar las condiciones de pago; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_TramiteCondicionesPagoSave'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_FraccionamientoPagoRealizadoList
@CveFraccionamiento int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fraccionamientos
WHERE CveFraccionamiento = @CveFraccionamiento
)
BEGIN
SELECT
@ErrorMostrar = 'El fraccionamiento solicitado no existe.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
SP.CveSolicitudPago,
SP.CveSolicitud,
SP.CveTramitePago,
V.CveVenta,
VP.CvePago,
V.SerieFolio,
V.Fecha,
VP.FechaPago,
VP.Referencia,
VP.Autorizado,
VP.FechaAutorizacion,
S.Folio AS FolioSolicitud,
E.Etapa,
TT.TipoTramite,
P.Nombre AS NombrePago,
CONVERT(decimal(18, 2), V.SubTotal) AS SubTotal,
CONVERT(decimal(18, 2), V.IVA) AS IVA,
CONVERT(decimal(18, 2), VP.Importe) AS Total
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Tra_Solicitudes AS S
ON S.CveSolicitud = SP.CveSolicitud
INNER JOIN dbo.FraccionamientosEtapas AS E
ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
INNER JOIN dbo.Tra_TiposTramite AS TT
ON TT.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = SP.CveTramitePago
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
INNER JOIN dbo.Vta_Pagos AS VP
ON VP.CveVenta = V.CveVenta
AND VP.CveSolicitud = SP.CveSolicitud
AND VP.CveTramitePago = SP.CveTramitePago
AND VP.EsActivo = 1
WHERE S.CveFraccionamiento = @CveFraccionamiento
ORDER BY
VP.FechaPago DESC,
VP.CvePago DESC;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar los pagos realizados; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_FraccionamientoPagoRealizadoList'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

BIN
Ley de Ingresos 2024.pdf Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,310 @@
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
DECLARE @CvePlataforma int;
DECLARE @CveCatalogos int;
DECLARE @CveProductosGrupo int;
DECLARE @CveProductos int;
DECLARE @CveUnidadesMedida int;
DECLARE @CveClasificacion int;
SELECT TOP (1)
@CvePlataforma = CvePlataforma
FROM dbo.Sis_Plataformas
WHERE NombrePlataforma = 'Plataforma de Desarrolladores'
ORDER BY CvePlataforma;
SELECT TOP (1)
@CveCatalogos = CveModulo
FROM dbo.Sis_Modulos
WHERE CvePlataforma = @CvePlataforma
AND CveModuloPadre IS NULL
AND NombreModulo = 'Catálogos'
AND Activo = 1
ORDER BY CveModulo;
IF @CveCatalogos IS NULL
BEGIN
THROW 50001, 'No se encontró el módulo Catálogos.', 1;
END;
SELECT TOP (1)
@CveProductos = CveModulo
FROM dbo.Sis_Modulos
WHERE CvePlataforma = @CvePlataforma
AND LOWER(ISNULL(Url, '')) =
LOWER('~/Pages/Catalogos/ProductosServicios.aspx')
COLLATE Modern_Spanish_CS_AS
ORDER BY CveModulo;
SELECT TOP (1)
@CveProductosGrupo = CveModulo
FROM dbo.Sis_Modulos
WHERE CvePlataforma = @CvePlataforma
AND CveModuloPadre = @CveCatalogos
AND Url IS NULL
AND NombreModulo = 'Productos'
ORDER BY CveModulo;
IF @CveProductosGrupo IS NULL
BEGIN
INSERT dbo.Sis_Modulos
(
CveModuloPadre,
CvePlataforma,
NombreModulo,
Descripcion,
Url,
ClaseCssIcono,
ClaseCssEstilo,
OrdenVisualizacion,
Visible,
Activo,
FechaCreacion
)
VALUES
(
@CveCatalogos,
@CvePlataforma,
'Productos',
'Catálogos de productos',
NULL,
'fa fa-cubes',
NULL,
50,
1,
1,
GETDATE()
);
SET @CveProductosGrupo = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
UPDATE dbo.Sis_Modulos
SET Descripcion = 'Catálogos de productos',
ClaseCssIcono = 'fa fa-cubes',
OrdenVisualizacion = 50,
Visible = 1,
Activo = 1,
FechaActualizacion = GETDATE()
WHERE CveModulo = @CveProductosGrupo;
END;
IF @CveProductos IS NULL
BEGIN
INSERT dbo.Sis_Modulos
(
CveModuloPadre,
CvePlataforma,
NombreModulo,
Descripcion,
Url,
ClaseCssIcono,
ClaseCssEstilo,
OrdenVisualizacion,
Visible,
Activo,
FechaCreacion
)
VALUES
(
@CveProductosGrupo,
@CvePlataforma,
'Productos',
'Productos y servicios',
'~/Pages/Catalogos/ProductosServicios.aspx',
'fa fa-cube',
NULL,
10,
1,
1,
GETDATE()
);
SET @CveProductos = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
UPDATE dbo.Sis_Modulos
SET CveModuloPadre = @CveProductosGrupo,
NombreModulo = 'Productos',
Descripcion = 'Productos y servicios',
ClaseCssIcono = 'fa fa-cube',
OrdenVisualizacion = 10,
Visible = 1,
Activo = 1,
FechaActualizacion = GETDATE()
WHERE CveModulo = @CveProductos;
END;
SELECT TOP (1)
@CveUnidadesMedida = CveModulo
FROM dbo.Sis_Modulos
WHERE CvePlataforma = @CvePlataforma
AND LOWER(ISNULL(Url, '')) =
LOWER('~/Pages/Catalogos/UnidadesMedida.aspx')
COLLATE Modern_Spanish_CS_AS
ORDER BY CveModulo;
IF @CveUnidadesMedida IS NULL
BEGIN
INSERT dbo.Sis_Modulos
(
CveModuloPadre,
CvePlataforma,
NombreModulo,
Descripcion,
Url,
ClaseCssIcono,
ClaseCssEstilo,
OrdenVisualizacion,
Visible,
Activo,
FechaCreacion
)
VALUES
(
@CveProductosGrupo,
@CvePlataforma,
'Unidades de medida',
'Catálogo de unidades de medida',
'~/Pages/Catalogos/UnidadesMedida.aspx',
'fa fa-balance-scale',
NULL,
20,
1,
1,
GETDATE()
);
SET @CveUnidadesMedida = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
UPDATE dbo.Sis_Modulos
SET CveModuloPadre = @CveProductosGrupo,
NombreModulo = 'Unidades de medida',
Descripcion = 'Catálogo de unidades de medida',
ClaseCssIcono = 'fa fa-balance-scale',
OrdenVisualizacion = 20,
Visible = 1,
Activo = 1,
FechaActualizacion = GETDATE()
WHERE CveModulo = @CveUnidadesMedida;
END;
SELECT TOP (1)
@CveClasificacion = CveModulo
FROM dbo.Sis_Modulos
WHERE CvePlataforma = @CvePlataforma
AND LOWER(ISNULL(Url, '')) =
LOWER('~/Pages/Catalogos/Clasificaciones.aspx')
COLLATE Modern_Spanish_CS_AS
ORDER BY CveModulo;
IF @CveClasificacion IS NULL
BEGIN
INSERT dbo.Sis_Modulos
(
CveModuloPadre,
CvePlataforma,
NombreModulo,
Descripcion,
Url,
ClaseCssIcono,
ClaseCssEstilo,
OrdenVisualizacion,
Visible,
Activo,
FechaCreacion
)
VALUES
(
@CveProductosGrupo,
@CvePlataforma,
'Clasificación',
'Catálogo de clasificaciones',
'~/Pages/Catalogos/Clasificaciones.aspx',
'fa fa-tags',
NULL,
30,
1,
1,
GETDATE()
);
SET @CveClasificacion = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
UPDATE dbo.Sis_Modulos
SET CveModuloPadre = @CveProductosGrupo,
NombreModulo = 'Clasificación',
Descripcion = 'Catálogo de clasificaciones',
ClaseCssIcono = 'fa fa-tags',
OrdenVisualizacion = 30,
Visible = 1,
Activo = 1,
FechaActualizacion = GETDATE()
WHERE CveModulo = @CveClasificacion;
END;
DECLARE @ModulosNuevos TABLE
(
CveModulo int NOT NULL PRIMARY KEY
);
INSERT INTO @ModulosNuevos (CveModulo)
VALUES
(@CveProductosGrupo),
(@CveUnidadesMedida),
(@CveClasificacion);
INSERT dbo.Sis_RolesModulos
(
CveRol,
CveModulo,
PuedeVer,
PuedeCrear,
PuedeModificar,
PuedeEliminar,
PuedeImprimir,
PuedeExportar,
FechaCreacion
)
SELECT
RM.CveRol,
M.CveModulo,
RM.PuedeVer,
RM.PuedeCrear,
RM.PuedeModificar,
RM.PuedeEliminar,
RM.PuedeImprimir,
RM.PuedeExportar,
GETDATE()
FROM dbo.Sis_RolesModulos AS RM
CROSS JOIN @ModulosNuevos AS M
WHERE RM.CveModulo = @CveProductos
AND NOT EXISTS
(
SELECT 1
FROM dbo.Sis_RolesModulos AS ExistingPermission
WHERE ExistingPermission.CveRol = RM.CveRol
AND ExistingPermission.CveModulo = M.CveModulo
);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
BEGIN
ROLLBACK TRANSACTION;
END;
THROW;
END CATCH;
GO

View File

@@ -0,0 +1,249 @@
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
DECLARE @CvePlataforma int;
SELECT TOP (1)
@CvePlataforma = CvePlataforma
FROM dbo.Sis_Plataformas
WHERE NombrePlataforma = 'Plataforma de Desarrolladores'
ORDER BY CvePlataforma;
IF @CvePlataforma IS NULL
BEGIN
THROW 50001, 'No se encontró la plataforma de desarrolladores.', 1;
END;
DECLARE @Menu TABLE
(
Clave varchar(50) NOT NULL PRIMARY KEY,
ClavePadre varchar(50) NULL,
NombreModulo varchar(150) NOT NULL,
Url varchar(500) NULL,
Icono varchar(150) NULL,
Orden int NOT NULL,
Visible bit NOT NULL,
Nivel int NOT NULL
);
INSERT INTO @Menu
(Clave, ClavePadre, NombreModulo, Url, Icono, Orden, Visible, Nivel)
VALUES
('Catalogos', NULL, 'Catálogos', NULL, 'fa fa-list-alt', 30, 1, 0),
('EstatusSolicitud', 'Catalogos', 'Estatus de solicitud', '~/Pages/Catalogos/EstatusSolicitud.aspx', 'fa fa-check-circle', 10, 1, 1),
('TiposTramite', 'Catalogos', 'Tipos de trámite', '~/Pages/Catalogos/TiposTramite.aspx', 'fa fa-file-text-o', 20, 1, 1),
('TipoTramiteDetalle', 'TiposTramite', 'Detalle de tipo de trámite', '~/Pages/Catalogos/TipoTramiteDetalle.aspx', 'fa fa-question-circle', 10, 0, 2),
('TiposDocumento', 'Catalogos', 'Tipos de documento', '~/Pages/Catalogos/TiposDocumento.aspx', 'fa fa-file-o', 30, 1, 1),
('DocumentosRequeridos', 'Catalogos', 'Documentos requeridos', '~/Pages/Catalogos/DocumentosRequeridos.aspx', 'fa fa-paperclip', 40, 1, 1),
('ProductosGrupo', 'Catalogos', 'Productos', NULL, 'fa fa-cubes', 50, 1, 1),
('ProductosServicios', 'ProductosGrupo', 'Productos', '~/Pages/Catalogos/ProductosServicios.aspx', 'fa fa-cube', 10, 1, 2),
('UnidadesMedida', 'ProductosGrupo', 'Unidades de medida', '~/Pages/Catalogos/UnidadesMedida.aspx', 'fa fa-balance-scale', 20, 1, 2),
('Clasificaciones', 'ProductosGrupo', 'Clasificación', '~/Pages/Catalogos/Clasificaciones.aspx', 'fa fa-tags', 30, 1, 2);
DECLARE @Ids TABLE
(
Clave varchar(50) NOT NULL PRIMARY KEY,
CveModulo int NOT NULL
);
DECLARE
@Clave varchar(50),
@ClavePadre varchar(50),
@NombreModulo varchar(150),
@Url varchar(500),
@Icono varchar(150),
@Orden int,
@Visible bit,
@Nivel int,
@CveModuloPadre int,
@CveModulo int;
DECLARE CatalogoCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT
Clave,
ClavePadre,
NombreModulo,
Url,
Icono,
Orden,
Visible,
Nivel
FROM @Menu
ORDER BY Nivel, Orden, Clave;
OPEN CatalogoCursor;
FETCH NEXT FROM CatalogoCursor
INTO @Clave, @ClavePadre, @NombreModulo, @Url, @Icono, @Orden,
@Visible, @Nivel;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @CveModuloPadre = NULL, @CveModulo = NULL;
IF @ClavePadre IS NOT NULL
BEGIN
SELECT @CveModuloPadre = CveModulo
FROM @Ids
WHERE Clave = @ClavePadre;
END;
SELECT TOP (1)
@CveModulo = CveModulo
FROM dbo.Sis_Modulos
WHERE CvePlataforma = @CvePlataforma
AND
(
(@Url IS NOT NULL AND LOWER(ISNULL(Url, '')) = LOWER(@Url) COLLATE Modern_Spanish_CS_AS)
OR
(@Url IS NULL AND Url IS NULL AND NombreModulo = @NombreModulo COLLATE Modern_Spanish_CS_AS)
)
ORDER BY CveModulo;
IF @CveModulo IS NULL
BEGIN
INSERT dbo.Sis_Modulos
(CveModuloPadre, CvePlataforma, NombreModulo, Descripcion, Url,
ClaseCssIcono, ClaseCssEstilo, OrdenVisualizacion, Visible,
Activo, FechaCreacion)
VALUES
(@CveModuloPadre, @CvePlataforma, @NombreModulo, @NombreModulo,
@Url, @Icono, NULL, @Orden, @Visible, 1, GETDATE());
SET @CveModulo = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
UPDATE dbo.Sis_Modulos
SET CveModuloPadre = @CveModuloPadre,
NombreModulo = @NombreModulo COLLATE Modern_Spanish_CS_AS,
Descripcion = @NombreModulo,
Url = @Url,
ClaseCssIcono = @Icono,
OrdenVisualizacion = @Orden,
Visible = @Visible,
Activo = 1,
FechaActualizacion = GETDATE()
WHERE CveModulo = @CveModulo;
END;
INSERT INTO @Ids (Clave, CveModulo)
VALUES (@Clave, @CveModulo);
FETCH NEXT FROM CatalogoCursor
INTO @Clave, @ClavePadre, @NombreModulo, @Url, @Icono, @Orden,
@Visible, @Nivel;
END;
CLOSE CatalogoCursor;
DEALLOCATE CatalogoCursor;
UPDATE RM
SET PuedeVer = CASE WHEN RM.CveRol IN (1, 2) THEN 1 ELSE 0 END,
PuedeCrear = CASE WHEN RM.CveRol IN (1, 2) THEN 1 ELSE 0 END,
PuedeModificar = CASE WHEN RM.CveRol IN (1, 2) THEN 1 ELSE 0 END,
PuedeEliminar = CASE WHEN RM.CveRol IN (1, 2) THEN 1 ELSE 0 END
FROM dbo.Sis_RolesModulos AS RM
INNER JOIN @Ids AS I ON I.CveModulo = RM.CveModulo;
INSERT dbo.Sis_RolesModulos
(CveRol, CveModulo, PuedeVer, PuedeCrear, PuedeModificar,
PuedeEliminar, PuedeImprimir, PuedeExportar, FechaCreacion)
SELECT
R.CveRol,
I.CveModulo,
1,
1,
1,
1,
0,
0,
GETDATE()
FROM dbo.Sis_Roles AS R
CROSS JOIN @Ids AS I
WHERE R.CveRol IN (1, 2)
AND NOT EXISTS
(
SELECT 1
FROM dbo.Sis_RolesModulos AS RM
WHERE RM.CveRol = R.CveRol
AND RM.CveModulo = I.CveModulo
);
DECLARE @Tablas TABLE
(
NombreTablaSQL varchar(128) NOT NULL,
NombreMostrar varchar(150) NOT NULL,
CampoLlave varchar(128) NOT NULL
);
INSERT INTO @Tablas
(NombreTablaSQL, NombreMostrar, CampoLlave)
VALUES
('Tra_EstatusSolicitud', 'Estatus de solicitud', 'CveEstatusSolicitud'),
('Tra_TiposTramite', 'Tipos de trámite', 'CveTipoTramite'),
('Tra_TiposDocumento', 'Tipos de documento', 'CveTipoDocumento'),
('Tra_DocumentosRequeridos', 'Documentos requeridos', 'CveDocumentoRequerido'),
('Tra_Preguntas', 'Preguntas de trámite', 'CvePregunta'),
('Tra_OpcionesPregunta', 'Opciones de respuesta', 'CveOpcionPregunta');
UPDATE T
SET NombreMostrar = S.NombreMostrar,
NombreCampoLlaveSQL = S.CampoLlave,
Activo = 1,
FechaMod = GETDATE()
FROM dbo.Bit_Tablas AS T
INNER JOIN @Tablas AS S ON S.NombreTablaSQL COLLATE Modern_Spanish_CS_AS = T.NombreTablaSQL;
INSERT dbo.Bit_Tablas
(NombreTablaSQL, NombreMostrar, Descripcion, NombreCampoLlaveSQL, Activo)
SELECT
S.NombreTablaSQL,
S.NombreMostrar,
'Catálogo interno de trámites.',
S.CampoLlave,
1
FROM @Tablas AS S
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Bit_Tablas AS T
WHERE T.NombreTablaSQL = S.NombreTablaSQL COLLATE Modern_Spanish_CS_AS
);
INSERT dbo.Bit_Campos
(CveTabla, NombreCampoSQL, NombreMostrar, MostrarEnBitacora, TipoDatoSQL, Activo)
SELECT
BT.CveTabla,
C.name,
C.name,
CASE WHEN C.name = S.CampoLlave THEN 0 ELSE 1 END,
TY.name,
1
FROM @Tablas AS S
INNER JOIN sys.tables AS T ON T.name = S.NombreTablaSQL COLLATE Modern_Spanish_CS_AS
INNER JOIN sys.schemas AS SC ON SC.schema_id = T.schema_id AND SC.name = 'dbo'
INNER JOIN sys.columns AS C ON C.object_id = T.object_id
INNER JOIN sys.types AS TY ON TY.user_type_id = C.user_type_id
INNER JOIN dbo.Bit_Tablas AS BT ON BT.NombreTablaSQL = S.NombreTablaSQL COLLATE Modern_Spanish_CS_AS
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Bit_Campos AS BC
WHERE BC.CveTabla = BT.CveTabla
AND BC.NombreCampoSQL = C.name COLLATE Modern_Spanish_CS_AS
);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
BEGIN
ROLLBACK TRANSACTION;
END;
THROW;
END CATCH;
GO

188
Menu_Desarrolladores.sql Normal file
View File

@@ -0,0 +1,188 @@
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
DECLARE @CvePlataforma int;
SELECT TOP (1)
@CvePlataforma = CvePlataforma
FROM dbo.Sis_Plataformas
WHERE NombrePlataforma = 'Plataforma de Desarrolladores'
AND Borrado = 0
ORDER BY CvePlataforma;
IF @CvePlataforma IS NULL
BEGIN
INSERT INTO dbo.Sis_Plataformas
(NombrePlataforma, Descripcion, Activo, FechaCreacion)
VALUES
('Plataforma de Desarrolladores', 'Portal WebForms para desarrolladores', 1, GETDATE());
SET @CvePlataforma = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
UPDATE dbo.Sis_Plataformas
SET Activo = 1,
FechaActualizacion = GETDATE()
WHERE CvePlataforma = @CvePlataforma;
END;
DECLARE @Menu TABLE
(
Clave varchar(50) NOT NULL PRIMARY KEY,
ClavePadre varchar(50) NULL,
NombreModulo varchar(150) NOT NULL,
Url varchar(500) NULL,
ClaseCssIcono varchar(150) NULL,
OrdenVisualizacion int NOT NULL
);
INSERT INTO @Menu
(Clave, ClavePadre, NombreModulo, Url, ClaseCssIcono, OrdenVisualizacion)
VALUES
('Inicio', NULL, 'Inicio', '~/Inicio.aspx', 'icon-home', 0),
('Desarrolladores', NULL, 'Desarrolladores', NULL, 'fa fa-address-card', 10),
('Tramites', 'Desarrolladores', 'Trámites', '~/Pages/Desarrolladores/Tramites.aspx', 'fa fa-dollar-sign', 10),
('ConsultaTramites', 'Desarrolladores', 'Consulta Trámites', '~/Pages/Desarrolladores/ConsultaTramites.aspx', 'fa fa-search', 20),
('Predios', 'Desarrolladores', 'Predios', '~/Pages/Desarrolladores/Predios.aspx', 'fa fa-house', 30),
('Fraccionamientos', 'Desarrolladores', 'Fraccionamientos', '~/Pages/Fraccionamientos/Fraccionamientos.aspx', 'fa fa-building', 35),
('FraccionamientoDetalle', 'Fraccionamientos', 'Detalle de fraccionamiento', '~/Pages/Fraccionamientos/FraccionamientoDetalle.aspx', 'fa fa-building-o', 10),
('Facturas', 'Desarrolladores', 'Facturas', '~/Pages/Desarrolladores/Facturas.aspx', 'fa fa-print', 40),
('HistorialFacturas', 'Desarrolladores', 'Historial Facturas', '~/Pages/Desarrolladores/HistorialFacturas.aspx', 'fa fa-print', 50),
('FacturasComerciales', 'Desarrolladores', 'Fact. Comerciales', '~/Pages/Desarrolladores/FacturasComerciales.aspx', 'fa fa-dollar-sign', 60),
('FacturasComercialesListado', 'Desarrolladores', 'Fact. Com. Listado', '~/Pages/Desarrolladores/FacturasComercialesListado.aspx', 'fa fa-print', 70),
('FacturasCfdi', NULL, 'Facturas (CFDI)', '~/Pages/Desarrolladores/FacturasCfdi.aspx', 'fa fa-address-card', 20);
DECLARE @Ids TABLE
(
Clave varchar(50) NOT NULL PRIMARY KEY,
CveModulo int NOT NULL
);
DECLARE
@Clave varchar(50),
@ClavePadre varchar(50),
@NombreModulo varchar(150),
@Url varchar(500),
@ClaseCssIcono varchar(150),
@OrdenVisualizacion int,
@CveModuloPadre int,
@CveModulo int;
DECLARE MenuCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT Clave, ClavePadre, NombreModulo, Url, ClaseCssIcono, OrdenVisualizacion
FROM @Menu
ORDER BY CASE WHEN ClavePadre IS NULL THEN 0 ELSE 1 END, OrdenVisualizacion, Clave;
OPEN MenuCursor;
FETCH NEXT FROM MenuCursor
INTO @Clave, @ClavePadre, @NombreModulo, @Url, @ClaseCssIcono, @OrdenVisualizacion;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @CveModuloPadre = NULL;
SET @CveModulo = NULL;
IF @ClavePadre IS NOT NULL
BEGIN
SELECT @CveModuloPadre = CveModulo
FROM @Ids
WHERE Clave = @ClavePadre;
END;
SELECT TOP (1)
@CveModulo = CveModulo
FROM dbo.Sis_Modulos
WHERE CvePlataforma = @CvePlataforma
AND
(
(@Url IS NOT NULL AND LOWER(ISNULL(Url, '')) = LOWER(@Url))
OR (@Url IS NULL AND Url IS NULL AND NombreModulo = @NombreModulo)
)
ORDER BY CveModulo;
IF @CveModulo IS NULL
BEGIN
INSERT INTO dbo.Sis_Modulos
(CveModuloPadre, CvePlataforma, NombreModulo, Descripcion, Url,
ClaseCssIcono, ClaseCssEstilo, OrdenVisualizacion, Visible, Activo, FechaCreacion)
VALUES
(@CveModuloPadre, @CvePlataforma, @NombreModulo, @NombreModulo, @Url,
@ClaseCssIcono, NULL, @OrdenVisualizacion, 1, 1, GETDATE());
SET @CveModulo = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
UPDATE dbo.Sis_Modulos
SET CveModuloPadre = @CveModuloPadre,
NombreModulo = @NombreModulo,
Url = @Url,
ClaseCssIcono = @ClaseCssIcono,
OrdenVisualizacion = @OrdenVisualizacion,
Visible = 1,
Activo = 1,
Borrado = 0,
FechaBorrado = NULL,
FechaActualizacion = GETDATE()
WHERE CveModulo = @CveModulo;
END;
INSERT INTO @Ids (Clave, CveModulo)
VALUES (@Clave, @CveModulo);
FETCH NEXT FROM MenuCursor
INTO @Clave, @ClavePadre, @NombreModulo, @Url, @ClaseCssIcono, @OrdenVisualizacion;
END;
CLOSE MenuCursor;
DEALLOCATE MenuCursor;
UPDATE M SET M.Visible = 0
FROM dbo.Sis_Modulos AS M
INNER JOIN @Ids AS I ON I.CveModulo = M.CveModulo
WHERE I.Clave = 'FraccionamientoDetalle';
UPDATE RM
SET RM.PuedeVer = 1,
RM.Borrado = 0,
RM.FechaBorrado = NULL
FROM dbo.Sis_RolesModulos AS RM
INNER JOIN @Ids AS M ON M.CveModulo = RM.CveModulo
INNER JOIN dbo.Sis_Roles AS R ON R.CveRol = RM.CveRol
WHERE R.Activo = 1
AND R.Borrado = 0;
INSERT INTO dbo.Sis_RolesModulos
(CveRol, CveModulo, PuedeVer, PuedeCrear, PuedeModificar,
PuedeEliminar, PuedeImprimir, PuedeExportar, FechaCreacion)
SELECT
R.CveRol, M.CveModulo, 1, 0, 0, 0, 0, 0, GETDATE()
FROM dbo.Sis_Roles AS R
CROSS JOIN @Ids AS M
WHERE R.Activo = 1
AND R.Borrado = 0
AND NOT EXISTS
(
SELECT 1
FROM dbo.Sis_RolesModulos AS RM
WHERE RM.CveRol = R.CveRol
AND RM.CveModulo = M.CveModulo
);
COMMIT TRANSACTION;
SELECT M.CveModulo, M.CveModuloPadre, M.NombreModulo, M.Url, M.OrdenVisualizacion
FROM dbo.Sis_Modulos AS M
INNER JOIN @Ids AS I ON I.CveModulo = M.CveModulo
ORDER BY M.CveModuloPadre, M.OrdenVisualizacion, M.NombreModulo;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
THROW;
END CATCH;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,377 @@
CREATE OR ALTER PROCEDURE dbo.PA_Bit_BitacoraListByRelations
@RelacionesXml xml = NULL,
@RegistrosOmitidos int,
@RegistrosPorPagina int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF @RegistrosOmitidos < 0 OR @RegistrosPorPagina <= 0
BEGIN
SET @ErrorMostrar = 'Los datos de paginación no son válidos.';
SET @ErrorTipo = 2;
RETURN;
END;
DECLARE @EsAdministrador bit = 0;
DECLARE @EsDesarrollador bit = 0;
SELECT
@EsAdministrador = CASE
WHEN R.NombreRol IN ('SuperUsuario', 'Administrador') THEN 1
ELSE 0
END,
@EsDesarrollador = CASE
WHEN R.NombreRol = 'Empresa' THEN 1
ELSE 0
END
FROM dbo.Sis_Usuarios AS U
INNER JOIN dbo.Sis_Roles AS R
ON R.CveRol = U.CveRol
WHERE U.CveUsuario = @CveUsuarioEjecuta
AND U.Activo = 1
AND R.Activo = 1;
DECLARE @Filtros TABLE
(
Orden int NOT NULL PRIMARY KEY,
NombreTablaSQL varchar(128)
COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreCampoSQL varchar(128)
COLLATE Modern_Spanish_CS_AS NOT NULL,
Valor nvarchar(250)
COLLATE Modern_Spanish_CS_AS NOT NULL
);
IF @RelacionesXml IS NOT NULL
BEGIN
INSERT INTO @Filtros
(
Orden,
NombreTablaSQL,
NombreCampoSQL,
Valor
)
SELECT
R.value('@Orden', 'int'),
R.value('@Tabla', 'varchar(128)'),
R.value('@Campo', 'varchar(128)'),
R.value('@Valor', 'nvarchar(250)')
FROM @RelacionesXml.nodes('/Relaciones/Relacion') AS X(R);
END;
DECLARE @FiltrosResueltos TABLE
(
Orden int NOT NULL PRIMARY KEY,
CveTabla int NOT NULL,
CveCampo int NOT NULL,
TipoDatoSQL varchar(128)
COLLATE Modern_Spanish_CS_AS NOT NULL,
Valor nvarchar(250)
COLLATE Modern_Spanish_CS_AS NOT NULL,
EsEntero bit NOT NULL
);
INSERT INTO @FiltrosResueltos
(
Orden,
CveTabla,
CveCampo,
TipoDatoSQL,
Valor,
EsEntero
)
SELECT
F.Orden,
T.CveTabla,
C.CveCampo,
C.TipoDatoSQL,
F.Valor,
CASE
WHEN C.TipoDatoSQL IN
(
'tinyint',
'smallint',
'int',
'bigint'
) THEN 1
ELSE 0
END
FROM @Filtros AS F
INNER JOIN dbo.Bit_Tablas AS T
ON T.NombreTablaSQL = F.NombreTablaSQL
AND T.Activo = 1
INNER JOIN dbo.Bit_Campos AS C
ON C.CveTabla = T.CveTabla
AND C.NombreCampoSQL = F.NombreCampoSQL
AND C.Activo = 1
WHERE C.TipoDatoSQL IS NOT NULL;
IF (SELECT COUNT(1) FROM @Filtros) <>
(SELECT COUNT(1) FROM @FiltrosResueltos)
BEGIN
SET @ErrorMostrar = 'Una relación utiliza una tabla o campo que no está configurado en la bitácora.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM @FiltrosResueltos
WHERE EsEntero = 1
AND TRY_CONVERT(bigint, Valor) IS NULL
)
BEGIN
SET @ErrorMostrar = 'El valor de una relación numérica no es válido.';
SET @ErrorTipo = 2;
RETURN;
END;
CREATE TABLE #BitacorasCoincidentes
(
CveBitacora bigint NOT NULL PRIMARY KEY,
FechaMovimiento datetime NOT NULL
);
INSERT INTO #BitacorasCoincidentes
(
CveBitacora,
FechaMovimiento
)
SELECT
B.CveBitacora,
B.FechaMovimiento
FROM dbo.Bit_Bitacora AS B
WHERE
(
@EsAdministrador = 1
OR
(
@EsDesarrollador = 1
AND EXISTS
(
SELECT 1
FROM dbo.Bit_BitacoraRelaciones AS BRCliente
INNER JOIN dbo.Bit_Tablas AS TCliente
ON TCliente.CveTabla =
BRCliente.CveTablaRelacionada
INNER JOIN dbo.Bit_Campos AS CCliente
ON CCliente.CveCampo =
BRCliente.CveCampoRelacion
AND CCliente.CveTabla = TCliente.CveTabla
INNER JOIN dbo.Sis_UsuariosClientes AS UC
ON UC.CveCliente =
BRCliente.ValorRelacionNumero
AND UC.CveUsuario = @CveUsuarioEjecuta
AND UC.Activo = 1
WHERE BRCliente.CveBitacora = B.CveBitacora
AND BRCliente.VisibleDesarrollador = 1
AND TCliente.NombreTablaSQL = 'Clientes'
AND CCliente.NombreCampoSQL = 'CveCliente'
)
)
)
AND
(
@EsDesarrollador = 0
OR NOT EXISTS
(
SELECT 1
FROM @FiltrosResueltos AS FCliente
INNER JOIN dbo.Bit_Tablas AS TClienteFiltro
ON TClienteFiltro.CveTabla = FCliente.CveTabla
INNER JOIN dbo.Bit_Campos AS CClienteFiltro
ON CClienteFiltro.CveCampo = FCliente.CveCampo
AND CClienteFiltro.CveTabla =
TClienteFiltro.CveTabla
WHERE TClienteFiltro.NombreTablaSQL = 'Clientes'
AND CClienteFiltro.NombreCampoSQL = 'CveCliente'
AND NOT EXISTS
(
SELECT 1
FROM dbo.Sis_UsuariosClientes AS UCClienteFiltro
WHERE UCClienteFiltro.CveUsuario =
@CveUsuarioEjecuta
AND UCClienteFiltro.CveCliente =
TRY_CONVERT(bigint, FCliente.Valor)
AND UCClienteFiltro.Activo = 1
)
)
)
AND NOT EXISTS
(
SELECT 1
FROM @FiltrosResueltos AS F
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Bit_BitacoraRelaciones AS BR
WHERE BR.CveBitacora = B.CveBitacora
AND BR.CveTablaRelacionada = F.CveTabla
AND BR.CveCampoRelacion = F.CveCampo
AND
(
@EsAdministrador = 1
OR BR.VisibleDesarrollador = 1
)
AND
(
(
F.EsEntero = 1
AND BR.ValorRelacionNumero =
TRY_CONVERT(bigint, F.Valor)
)
OR
(
F.EsEntero = 0
AND BR.ValorRelacionTexto =
F.Valor COLLATE Modern_Spanish_CS_AS
)
)
)
);
DECLARE @TotalRegistros int;
SELECT @TotalRegistros = COUNT(DISTINCT CveBitacora)
FROM #BitacorasCoincidentes;
CREATE TABLE #BitacorasPagina
(
CveBitacora bigint NOT NULL PRIMARY KEY,
Orden int NOT NULL
);
INSERT INTO #BitacorasPagina
(
CveBitacora,
Orden
)
SELECT
C.CveBitacora,
ROW_NUMBER() OVER
(
ORDER BY
C.FechaMovimiento DESC,
C.CveBitacora DESC
)
FROM #BitacorasCoincidentes AS C
ORDER BY
C.FechaMovimiento DESC,
C.CveBitacora DESC
OFFSET @RegistrosOmitidos ROWS
FETCH NEXT @RegistrosPorPagina ROWS ONLY;
SELECT @TotalRegistros AS TotalRegistros;
SELECT
B.CveBitacora,
B.CveTabla,
T.NombreTablaSQL,
T.NombreMostrar AS NombreTabla,
B.CveTipoMovimiento,
M.Nombre AS TipoMovimiento,
B.CveDefinicionAccion,
A.NombreAccion,
A.DescripcionAccion,
B.CveUsuarioEjecuta,
B.CveUsuarioAutoriza,
B.FechaAutorizacion,
B.LlaveRegistro,
B.DescripcionMovimiento,
B.FechaMovimiento,
B.DireccionIP,
B.NombreEquipo,
B.Modulo
FROM #BitacorasPagina AS P
INNER JOIN dbo.Bit_Bitacora AS B
ON B.CveBitacora = P.CveBitacora
INNER JOIN dbo.Bit_Tablas AS T
ON T.CveTabla = B.CveTabla
INNER JOIN dbo.Bit_TiposMovimiento AS M
ON M.CveTipoMovimiento = B.CveTipoMovimiento
LEFT JOIN dbo.Bit_DefinicionesAccion AS A
ON A.CveDefinicionAccion = B.CveDefinicionAccion
ORDER BY P.Orden;
SELECT
BC.CveBitacoraCampo,
BC.CveBitacora,
BC.CveCampo,
C.NombreCampoSQL,
C.NombreMostrar,
BC.ValorAnterior,
BC.ValorNuevo
FROM #BitacorasPagina AS P
INNER JOIN dbo.Bit_BitacoraCampos AS BC
ON BC.CveBitacora = P.CveBitacora
INNER JOIN dbo.Bit_Campos AS C
ON C.CveCampo = BC.CveCampo
WHERE @EsAdministrador = 1
OR C.MostrarEnBitacora = 1
ORDER BY
P.Orden,
BC.CveBitacoraCampo;
SELECT
BR.CveBitacoraRelacion,
BR.CveBitacora,
BR.CveTipoRelacion,
TR.Nombre AS TipoRelacion,
BR.CveTablaRelacionada,
T.NombreTablaSQL,
BR.CveCampoRelacion,
C.NombreCampoSQL,
BR.LlaveRegistroRelacionada,
BR.ValorRelacionNumero,
BR.ValorRelacionTexto,
BR.VisibleDesarrollador,
BR.DescripcionRelacion
FROM #BitacorasPagina AS P
INNER JOIN dbo.Bit_BitacoraRelaciones AS BR
ON BR.CveBitacora = P.CveBitacora
INNER JOIN dbo.Bit_TiposRelacion AS TR
ON TR.CveTipoRelacion = BR.CveTipoRelacion
INNER JOIN dbo.Bit_Tablas AS T
ON T.CveTabla = BR.CveTablaRelacionada
LEFT JOIN dbo.Bit_Campos AS C
ON C.CveCampo = BR.CveCampoRelacion
AND C.CveTabla = T.CveTabla
WHERE @EsAdministrador = 1
OR BR.VisibleDesarrollador = 1
ORDER BY
P.Orden,
BR.CveBitacoraRelacion;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al consultar la bitácora; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Bit_BitacoraListByRelations'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,703 @@
SET NOCOUNT ON;
SET XACT_ABORT ON;
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
/* Texto general: CS_AS. Codigo* e identificadores reales de usuario: CI_AS. */
IF EXISTS (SELECT 1 FROM [dbo].[Clasificaciones] GROUP BY [Clasificacion] COLLATE Modern_Spanish_CS_AS, [Codigo] COLLATE Modern_Spanish_CI_AS HAVING COUNT_BIG(*) > 1) THROW 51000, N'La conversión genera duplicados en dbo.Clasificaciones, índice UN_Clasificacion.', 1;
IF EXISTS (SELECT 1 FROM [dbo].[Sis_Permisos] GROUP BY [CodigoPermiso] COLLATE Modern_Spanish_CI_AS HAVING COUNT_BIG(*) > 1) THROW 51000, N'La conversión genera duplicados en dbo.Sis_Permisos, índice UQ_Sis_Permisos_CodigoPermiso.', 1;
IF EXISTS (SELECT 1 FROM [dbo].[Sis_Usuarios] GROUP BY [NombreUsuario] COLLATE Modern_Spanish_CI_AS HAVING COUNT_BIG(*) > 1) THROW 51000, N'La conversión genera duplicados en dbo.Sis_Usuarios, índice UQ_Sis_Usuarios_NombreUsuario.', 1;
IF EXISTS (SELECT 1 FROM [dbo].[Tra_EstatusSolicitud] GROUP BY [Codigo] COLLATE Modern_Spanish_CI_AS HAVING COUNT_BIG(*) > 1) THROW 51000, N'La conversión genera duplicados en dbo.Tra_EstatusSolicitud, índice UQ_Tra_EstatusSolicitud_Codigo.', 1;
IF EXISTS (SELECT 1 FROM [dbo].[Tra_Preguntas] WHERE ([Codigo] IS NOT NULL) GROUP BY [Codigo] COLLATE Modern_Spanish_CI_AS HAVING COUNT_BIG(*) > 1) THROW 51000, N'La conversión genera duplicados en dbo.Tra_Preguntas, índice UX_Tra_Preguntas_Codigo.', 1;
IF EXISTS (SELECT 1 FROM [dbo].[Tra_TiposTramite] GROUP BY [Codigo] COLLATE Modern_Spanish_CI_AS HAVING COUNT_BIG(*) > 1) THROW 51000, N'La conversión genera duplicados en dbo.Tra_TiposTramite, índice UQ_Tra_TiposTramite_Codigo.', 1;
BEGIN TRY
BEGIN TRANSACTION;
/* Eliminar llaves foráneas */
ALTER TABLE [dbo].[EstatusFactura] DROP CONSTRAINT [FK_EstatusFactura_Vta_TipoDocumentos];
ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [FK_Ventas_Vta_TipoDocumentos];
/* Eliminar CHECK */
ALTER TABLE [dbo].[Bit_Bitacora] DROP CONSTRAINT [CK_Bit_Bitacora_Autorizacion];
ALTER TABLE [dbo].[Bit_BitacoraRelaciones] DROP CONSTRAINT [CK_Bit_BitacoraRelaciones_ValorRelacion];
ALTER TABLE [dbo].[Clientes] DROP CONSTRAINT [CK_Clientes_RFC_Requerido];
ALTER TABLE [dbo].[Conta_Cuentas] DROP CONSTRAINT [CK_Conta_Cuentas_Padre];
ALTER TABLE [dbo].[Conta_Cuentas] DROP CONSTRAINT [CK_Conta_Cuentas_Padre_Requerido];
ALTER TABLE [dbo].[Conta_PrePolizas] DROP CONSTRAINT [CK_Conta_PrePolizas_Concepto];
ALTER TABLE [dbo].[Conta_PrePolizas] DROP CONSTRAINT [CK_Conta_PrePolizas_Fecha_2000_2050];
ALTER TABLE [dbo].[Conta_PrePolizas] DROP CONSTRAINT [CK_Conta_PrePolizas_FolioPoliza];
ALTER TABLE [dbo].[Fraccionamientos] DROP CONSTRAINT [CK_Fraccionamientos_Hectareas];
ALTER TABLE [dbo].[FraccionamientosEtapas] DROP CONSTRAINT [CK_FraccionamientosEtapas_Hectareas];
ALTER TABLE [dbo].[FraccionamientosLotes] DROP CONSTRAINT [CK_FraccionamientosLotes_MetrosCuadrados];
ALTER TABLE [dbo].[ProductosServicios] DROP CONSTRAINT [CK_AsientoContableCompras];
ALTER TABLE [dbo].[ProductosServicios] DROP CONSTRAINT [CK_AsientoContableVentas];
ALTER TABLE [dbo].[ProductosServicios] DROP CONSTRAINT [CK_ProductosServicios_IVA];
ALTER TABLE [dbo].[Sis_Notificaciones] DROP CONSTRAINT [CK_Sis_Notificaciones_Estado];
ALTER TABLE [dbo].[Sis_Notificaciones] DROP CONSTRAINT [CK_Sis_Notificaciones_Tipo];
ALTER TABLE [dbo].[Sis_NotificacionesEnvios] DROP CONSTRAINT [CK_Sis_NotificacionesEnvios_Canal];
ALTER TABLE [dbo].[Sis_NotificacionesEnvios] DROP CONSTRAINT [CK_Sis_NotificacionesEnvios_Estado];
ALTER TABLE [dbo].[Sis_PoliticasLimpieza] DROP CONSTRAINT [CK_Sis_PoliticasLimpieza_DiasRetencion];
ALTER TABLE [dbo].[Sis_PoliticasLimpieza] DROP CONSTRAINT [CK_Sis_PoliticasLimpieza_TamanoLote];
ALTER TABLE [dbo].[Sis_UsuariosAutorizaciones] DROP CONSTRAINT [CK_Sis_UsuariosAutorizaciones_Estado];
ALTER TABLE [dbo].[Tra_CostosTramite] DROP CONSTRAINT [CK_Tra_CostosTramite_Importe];
ALTER TABLE [dbo].[Tra_CostosTramite] DROP CONSTRAINT [CK_Tra_CostosTramite_Vigencia];
ALTER TABLE [dbo].[Tra_DocumentosSolicitud] DROP CONSTRAINT [CK_Tra_DocumentosSolicitud_Tamano];
ALTER TABLE [dbo].[Tra_RespuestasSolicitud] DROP CONSTRAINT [CK_Tra_RespuestasSolicitud_Valor];
ALTER TABLE [dbo].[Tra_SolicitudesDependencias] DROP CONSTRAINT [CK_Tra_SolicitudesDependencias_Diferentes];
ALTER TABLE [dbo].[Tra_TiposDocumento] DROP CONSTRAINT [CK_Tra_TiposDocumento_Tamano];
ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CHK_VentasMail];
ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas];
ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_1];
ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_Dev_CveVentaPadre];
ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_FechaEjecucion_MinMax];
ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_Moneda_TipoCambio];
ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_TMp_AlmacenInactivo];
ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_Total];
ALTER TABLE [dbo].[Vta_Pagos] DROP CONSTRAINT [CK_Vta_Pagos_Importe];
ALTER TABLE [dbo].[Vta_Pagos] DROP CONSTRAINT [CK_Vta_Pagos_SaldoFavor];
/* Eliminar índices */
ALTER TABLE [dbo].[Banc_Bancos] DROP CONSTRAINT [UN_Bancos];
ALTER TABLE [dbo].[Banc_BancosCuentas] DROP CONSTRAINT [UN_Banc_BancosCuentas];
ALTER TABLE [dbo].[Banc_TiposCuenta] DROP CONSTRAINT [UN_BancTipoCuenta];
DROP INDEX [IX_Bit_Bitacora_Tabla_Llave_Fecha] ON [dbo].[Bit_Bitacora];
DROP INDEX [IX_Bit_BitacoraRelaciones_Tabla_Llave] ON [dbo].[Bit_BitacoraRelaciones];
DROP INDEX [IX_Bit_BitacoraRelaciones_Filtro] ON [dbo].[Bit_BitacoraRelaciones];
DROP INDEX [IX_Bit_BitacoraRelaciones_FiltroTexto] ON [dbo].[Bit_BitacoraRelaciones];
ALTER TABLE [dbo].[Bit_Campos] DROP CONSTRAINT [UQ_Bit_Campos_Tabla_Campo];
ALTER TABLE [dbo].[Bit_DefinicionesAccion] DROP CONSTRAINT [UQ_Bit_DefinicionesAccion];
ALTER TABLE [dbo].[Bit_Tablas] DROP CONSTRAINT [UQ_Bit_Tablas_NombreTablaSQL];
ALTER TABLE [dbo].[Bit_TiposMovimiento] DROP CONSTRAINT [UQ_Bit_TiposMovimiento_Nombre];
ALTER TABLE [dbo].[Bit_TiposRelacion] DROP CONSTRAINT [UQ_Bit_TiposRelacion_Nombre];
ALTER TABLE [dbo].[Clasificaciones] DROP CONSTRAINT [UN_Clasificacion];
ALTER TABLE [dbo].[Conta_ConceptosContables] DROP CONSTRAINT [UN_Conta_ConceptosContables];
ALTER TABLE [dbo].[Conta_TiposPoliza] DROP CONSTRAINT [UN_ContaTipoPoliza];
ALTER TABLE [dbo].[Fraccionamientos] DROP CONSTRAINT [UQ_Fraccionamientos_Cliente_Nombre];
ALTER TABLE [dbo].[FraccionamientosEtapas] DROP CONSTRAINT [UQ_FraccionamientosEtapas_Fraccionamiento_Etapa];
DROP INDEX [IX_FraccionamientosLotes_Etapa] ON [dbo].[FraccionamientosLotes];
ALTER TABLE [dbo].[Gral_Categorias] DROP CONSTRAINT [UK_Gral_Categorias];
ALTER TABLE [dbo].[Gral_Monedas] DROP CONSTRAINT [UN_Moneda];
DROP INDEX [IND_Gral_SAT_Colonia_CP] ON [dbo].[Gral_SAT_Colonia];
DROP INDEX [IX_Gral_SAT_Colonia_CP_Vigente] ON [dbo].[Gral_SAT_Colonia];
DROP INDEX [IND_Gral_SAT_CP_ClaveSATEstado] ON [dbo].[Gral_SAT_CP];
ALTER TABLE [dbo].[Gral_SAT_CP] DROP CONSTRAINT [UQ_Gral_SAT_CP_CP];
DROP INDEX [IX_Gral_SAT_CP_BusquedaRegistro] ON [dbo].[Gral_SAT_CP];
DROP INDEX [IX_Gral_SAT_Localidad_Claves_Vigente] ON [dbo].[Gral_SAT_Localidad];
DROP INDEX [IX_Gral_SAT_Municipio_Claves_Vigente] ON [dbo].[Gral_SAT_Municipio];
ALTER TABLE [dbo].[Gral_SAT_UnidadesMedida] DROP CONSTRAINT [UK_Gral_SAT_UnidadesMedida];
ALTER TABLE [dbo].[Inv_Almacenes] DROP CONSTRAINT [UN_INV_Almacenes];
ALTER TABLE [dbo].[Inv_TiposAlmacenes] DROP CONSTRAINT [UN_INV_TiposAlmacenes];
ALTER TABLE [dbo].[Proyectos] DROP CONSTRAINT [UN_Proyectos];
ALTER TABLE [dbo].[Sat_Bancos] DROP CONSTRAINT [UQ_Sat_Bancos_CveBanco];
DROP INDEX [IX_Sis_IntentosInicioSesion_NombreUsuario_FechaCreacion] ON [dbo].[Sis_IntentosInicioSesion];
ALTER TABLE [dbo].[Sis_Permisos] DROP CONSTRAINT [UQ_Sis_Permisos_CodigoPermiso];
ALTER TABLE [dbo].[Sis_Plataformas] DROP CONSTRAINT [UQ_Sis_Plataformas_NombrePlataforma];
ALTER TABLE [dbo].[Sis_PoliticasLimpieza] DROP CONSTRAINT [PK_Sis_PoliticasLimpieza];
ALTER TABLE [dbo].[Sis_Roles] DROP CONSTRAINT [UQ_Sis_Roles_NombreRol];
ALTER TABLE [dbo].[Sis_Usuarios] DROP CONSTRAINT [UQ_Sis_Usuarios_NombreUsuario];
DROP INDEX [UQ_Sis_Usuarios_CorreoElectronico] ON [dbo].[Sis_Usuarios];
ALTER TABLE [dbo].[Sis_UsuariosSesiones] DROP CONSTRAINT [UQ_Sis_UsuariosSesiones_TokenSesion];
ALTER TABLE [dbo].[Sis_UsuariosVerificacionesCorreo] DROP CONSTRAINT [UQ_Sis_UsuariosVerificacionesCorreo_HashToken];
ALTER TABLE [dbo].[SubProyectos] DROP CONSTRAINT [UN_SubProyectos];
ALTER TABLE [dbo].[Tra_EstatusSolicitud] DROP CONSTRAINT [UQ_Tra_EstatusSolicitud_Codigo];
ALTER TABLE [dbo].[Tra_OpcionesPregunta] DROP CONSTRAINT [UQ_Tra_OpcionesPregunta_Pregunta_Texto];
DROP INDEX [UX_Tra_Preguntas_Codigo] ON [dbo].[Tra_Preguntas];
ALTER TABLE [dbo].[Tra_Solicitudes] DROP CONSTRAINT [UQ_Tra_Solicitudes_Folio];
ALTER TABLE [dbo].[Tra_TiposDocumento] DROP CONSTRAINT [UQ_Tra_TiposDocumento_Nombre];
ALTER TABLE [dbo].[Tra_TiposTramite] DROP CONSTRAINT [UQ_Tra_TiposTramite_Codigo];
ALTER TABLE [dbo].[UnidadesMedida] DROP CONSTRAINT [UN_UnidadesMedida];
ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [UK_Ventas_TipoDocto_Serie_Folio_CveSubProyecto];
ALTER TABLE [dbo].[Vta_ClientesSucursales] DROP CONSTRAINT [UN_Vta_ClientesSucursales];
ALTER TABLE [dbo].[Vta_TipoDocumentos] DROP CONSTRAINT [PK_Vta_TipoDocumentos];
/* Eliminar estadísticas */
DROP STATISTICS [dbo].[Bit_Bitacora].[_WA_Sys_00000008_1590259A];
DROP STATISTICS [dbo].[Bit_Bitacora].[_WA_Sys_0000000D_1590259A];
DROP STATISTICS [dbo].[Bit_Campos].[_WA_Sys_00000003_0559BDD1];
DROP STATISTICS [dbo].[Bit_Campos].[_WA_Sys_00000009_0559BDD1];
DROP STATISTICS [dbo].[Clientes].[_WA_Sys_00000013_3D2915A8];
DROP STATISTICS [dbo].[Fraccionamientos].[_WA_Sys_00000003_3BCADD1B];
DROP STATISTICS [dbo].[Fraccionamientos].[_WA_Sys_00000005_3BCADD1B];
DROP STATISTICS [dbo].[Fraccionamientos_Estatus].[_WA_Sys_00000002_50E5F592];
DROP STATISTICS [dbo].[Gral_SAT_CP].[_WA_Sys_00000003_2CA8951C];
DROP STATISTICS [dbo].[Gral_SAT_CP].[_WA_Sys_00000004_2CA8951C];
DROP STATISTICS [dbo].[Gral_SAT_Estado].[_WA_Sys_00000002_6225902D];
DROP STATISTICS [dbo].[Gral_SAT_Estado].[_WA_Sys_00000003_6225902D];
DROP STATISTICS [dbo].[Gral_SAT_Localidad].[_WA_Sys_00000002_603D47BB];
DROP STATISTICS [dbo].[Gral_SAT_Localidad].[_WA_Sys_00000003_603D47BB];
DROP STATISTICS [dbo].[Gral_SAT_Municipio].[_WA_Sys_00000002_2D9CB955];
DROP STATISTICS [dbo].[Gral_SAT_Municipio].[_WA_Sys_00000003_2D9CB955];
DROP STATISTICS [dbo].[Gral_SAT_Pais].[_WA_Sys_00000002_32616E72];
DROP STATISTICS [dbo].[Sis_Modulos].[_WA_Sys_00000004_4BAC3F29];
DROP STATISTICS [dbo].[Sis_Modulos].[_WA_Sys_00000006_4BAC3F29];
DROP STATISTICS [dbo].[Sis_Usuarios].[_WA_Sys_00000004_440B1D61];
/* Eliminar columnas calculadas */
ALTER TABLE [dbo].[Conta_PrePolizas] DROP COLUMN [AnioMes];
ALTER TABLE [dbo].[ProductosServicios] DROP COLUMN [CodigoPS];
ALTER TABLE [dbo].[Ventas] DROP COLUMN [SerieFolio];
/* Alterar columnas */
ALTER TABLE [dbo].[Banc_Bancos] ALTER COLUMN [Banco] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Banc_Bancos] ALTER COLUMN [Ejecutivo] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Banc_Bancos] ALTER COLUMN [Telefono] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Banc_BancosCuentas] ALTER COLUMN [NumCuenta] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Banc_BancosCuentas] ALTER COLUMN [CLABE] [varchar](18) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Banc_BancosCuentas] ALTER COLUMN [FormatoCheque] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Banc_BancosCuentas] ALTER COLUMN [ConvenioPagoElectronico] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Banc_BancosCuentas] ALTER COLUMN [PrefijoConta] [varchar](2) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Banc_BancosCuentas] ALTER COLUMN [ConvenioPagoElectronicoGrupos] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Banc_BancosCuentas] ALTER COLUMN [NumeroSucursal] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Banc_BancosCuentas] ALTER COLUMN [ConvenioPagoElectronicoNomina] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Banc_TiposCuenta] ALTER COLUMN [TipoCuenta] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_Bitacora] ALTER COLUMN [LlaveRegistro] [nvarchar](250) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_Bitacora] ALTER COLUMN [DescripcionMovimiento] [nvarchar](1000) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_Bitacora] ALTER COLUMN [DireccionIP] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Bit_Bitacora] ALTER COLUMN [NombreEquipo] [varchar](150) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Bit_Bitacora] ALTER COLUMN [Modulo] [varchar](150) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Bit_BitacoraCampos] ALTER COLUMN [ValorAnterior] [nvarchar](MAX) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Bit_BitacoraCampos] ALTER COLUMN [ValorNuevo] [nvarchar](MAX) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Bit_BitacoraRelaciones] ALTER COLUMN [LlaveRegistroRelacionada] [nvarchar](250) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_BitacoraRelaciones] ALTER COLUMN [ValorRelacionTexto] [nvarchar](250) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Bit_BitacoraRelaciones] ALTER COLUMN [DescripcionRelacion] [nvarchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Bit_Campos] ALTER COLUMN [NombreCampoSQL] [varchar](128) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_Campos] ALTER COLUMN [NombreMostrar] [varchar](150) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_Campos] ALTER COLUMN [TipoDatoSQL] [varchar](128) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Bit_DefinicionesAccion] ALTER COLUMN [NombreAccion] [varchar](150) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_DefinicionesAccion] ALTER COLUMN [DescripcionAccion] [varchar](500) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_Tablas] ALTER COLUMN [NombreTablaSQL] [varchar](128) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_Tablas] ALTER COLUMN [NombreMostrar] [varchar](150) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_Tablas] ALTER COLUMN [Descripcion] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Bit_Tablas] ALTER COLUMN [NombreCampoLlaveSQL] [varchar](128) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Bit_TiposMovimiento] ALTER COLUMN [Nombre] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_TiposMovimiento] ALTER COLUMN [Descripcion] [varchar](250) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Bit_TiposRelacion] ALTER COLUMN [Nombre] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Bit_TiposRelacion] ALTER COLUMN [Descripcion] [varchar](300) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clasificaciones] ALTER COLUMN [Codigo] [varchar](20) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[Clasificaciones] ALTER COLUMN [Clasificacion] [varchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Nombre] [varchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Codigo] [varchar](50) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [NombreCorto] [varchar](30) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [NombreComercial] [varchar](200) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ApellidoPaterno] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ApellidoMaterno] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Nombres] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Sucursal] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Direccion] [varchar](90) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [NoExt] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [NoInt] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Colonia] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Localidad] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Ciudad] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Estado] [varchar](35) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Pais] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [RFC] [varchar](15) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [CP] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Telefono] [varchar](25) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [TelefonoExtension] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [TelefonoOtros] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Contacto] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Mail] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Pagina] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Giro] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [NotificarA] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ConvenioCIE] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [RecepcionPagos] [varchar](15) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [TipoPago] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Vendedor] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Tipo] [varchar](3) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [FormaFacturacion] [varchar](13) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [NumCtaPago] [varchar](30) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [FEMSA_NumSociedad] [varchar](4) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [FEMSA_NumProveedor] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [FEMSA_Mail] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Detallista_GLNComprador] [varchar](18) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Detallista_Departamento] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Detallista_GLNVendedor] [varchar](18) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Detallista_NumProveedor] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [SevenEleven_NumProveedor] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Ford_GSDB] [varchar](5) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [MailCotizacion] [varchar](300) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [CobranzaContacto] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [CobranzaTelefono] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [CobranzaExt] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [CobranzaCorreo] [varchar](2000) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Horario] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Documentacion] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [PortalFacturacion] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [DiasPago] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [UsuarioPortal] [varchar](50) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [PasswordPortal] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [DiasRevision] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ObservacionRevision] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ReferenciaFiscal] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Celular] [varchar](15) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ExtOtros] [varchar](15) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [NumRegIdTrib] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ComExtEstado] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ComExtMunicipio] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ComExtColonia] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [CorreoEntregaCompras] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [CorreoEntregaAlmacen] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [Punto] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [CorreoCumplimiento] [varchar](200) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [RegimenSociedad] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [RepresentanteLegal] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ComExtCalle] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ComExtNumExt] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [ComExtCP] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [CreditoRegistroFirmas] [varchar](250) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Clientes] ALTER COLUMN [VentasComplementos] [varchar](MAX) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Conta_CodigosAgrupadoresSAT] ALTER COLUMN [Codigo] [nvarchar](20) COLLATE Modern_Spanish_CI_AS NOT NULL;
ALTER TABLE [dbo].[Conta_CodigosAgrupadoresSAT] ALTER COLUMN [Nombre] [nvarchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Conta_CodigosAgrupadoresSAT] ALTER COLUMN [Tipo] [nvarchar](1) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Conta_ConceptosContables] ALTER COLUMN [Tipo] [varchar](5) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Conta_ConceptosContables] ALTER COLUMN [ConceptoContable] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Conta_Cuentas] ALTER COLUMN [Codigo] [varchar](50) COLLATE Modern_Spanish_CI_AS NOT NULL;
ALTER TABLE [dbo].[Conta_Cuentas] ALTER COLUMN [Nombre] [varchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Conta_Cuentas] ALTER COLUMN [NomIdioma] [varchar](250) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Conta_Cuentas] ALTER COLUMN [CodigoVinculacion] [varchar](50) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[Conta_Cuentas] ALTER COLUMN [CodigoAgrupacion] [varchar](100) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[Conta_PlantillasPolizas] ALTER COLUMN [PlantillaPoliza] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Conta_PrePolizas] ALTER COLUMN [Modulo] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Conta_PrePolizas] ALTER COLUMN [Concepto] [varchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Conta_PrePolizas] ALTER COLUMN [NumeroPoliza] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Conta_PrePolizas] ALTER COLUMN [CodigoNumeroPoliza] [varchar](5) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[Conta_PrePolizasDetalle] ALTER COLUMN [Referencia] [varchar](200) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Conta_PrePolizasDetalle] ALTER COLUMN [Concepto] [varchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Conta_TiposPoliza] ALTER COLUMN [TipoPoliza] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[EstatusFactura] ALTER COLUMN [EstatusFactura] [varchar](30) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[EstatusFactura] ALTER COLUMN [TipoDocto] [varchar](3) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Fraccionamientos] ALTER COLUMN [Fraccionamiento] [varchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Fraccionamientos] ALTER COLUMN [Ubicacion] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Fraccionamientos_Estatus] ALTER COLUMN [Estatus] [varchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[FraccionamientosEtapas] ALTER COLUMN [Etapa] [varchar](150) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[FraccionamientosLotes] ALTER COLUMN [Tipo] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[FraccionamientosLotes] ALTER COLUMN [Calle] [varchar](200) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[FraccionamientosLotes] ALTER COLUMN [Catastro] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[FraccionamientosLotes] ALTER COLUMN [Numero] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[FraccionamientosLotes] ALTER COLUMN [Duplicador] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_Categorias] ALTER COLUMN [Categoria] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_Monedas] ALTER COLUMN [Moneda] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_Monedas] ALTER COLUMN [Abreviatura] [varchar](3) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_Monedas] ALTER COLUMN [AbreviaturaSAT] [varchar](5) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_Monedas] ALTER COLUMN [LayoutBBVA] [varchar](3) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_Monedas] ALTER COLUMN [Alias1] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_Monedas] ALTER COLUMN [Alias2] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_Monedas] ALTER COLUMN [Alias3] [varchar](30) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_RegimenesFiscales] ALTER COLUMN [RegimenFiscal] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_RegimenesFiscales] ALTER COLUMN [CodigoRegimenFiscal] [varchar](3) COLLATE Modern_Spanish_CI_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Colonia] ALTER COLUMN [ClaveSATColonia] [varchar](10) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Colonia] ALTER COLUMN [CP] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Colonia] ALTER COLUMN [NombreAsentamiento] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_CP] ALTER COLUMN [CP] [varchar](5) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_CP] ALTER COLUMN [ClaveSATEstado] [varchar](5) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_CP] ALTER COLUMN [ClaveSATMunicipio] [varchar](5) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_CP] ALTER COLUMN [ClaveSATLocalidad] [varchar](5) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_CP_MaterialPeligroso] ALTER COLUMN [ClaveMaterialPeligroso] [varchar](10) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_CP_MaterialPeligroso] ALTER COLUMN [MaterialPeligroso] [varchar](390) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_CP_MaterialPeligroso] ALTER COLUMN [ClaseoDiv] [varchar](8) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_CP_MaterialPeligroso] ALTER COLUMN [PeligroSecundario] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_CP_MaterialPeligroso] ALTER COLUMN [NombreTecnico] [varchar](400) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_CP_MaterialPeligroso] ALTER COLUMN [Version] [varchar](5) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_Estado] ALTER COLUMN [ClaveSATEstado] [varchar](5) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Estado] ALTER COLUMN [ClaveSATPais] [varchar](3) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Estado] ALTER COLUMN [NombreEstado] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Estado] ALTER COLUMN [ClaveImpuestoEstado] [varchar](2) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_Localidad] ALTER COLUMN [ClaveSATLocalidad] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Localidad] ALTER COLUMN [ClaveSATEstado] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Localidad] ALTER COLUMN [NombreLocalidad] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Municipio] ALTER COLUMN [ClaveSATMunicipio] [varchar](5) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Municipio] ALTER COLUMN [ClaveSATEstado] [varchar](5) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Municipio] ALTER COLUMN [Descripcion] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_ObjetoImpuesto] ALTER COLUMN [ObjetoImpuesto] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_ObjetoImpuesto] ALTER COLUMN [CodigoObjetoImpuesto] [varchar](2) COLLATE Modern_Spanish_CI_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Pais] ALTER COLUMN [ClaveSATPais] [varchar](5) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Pais] ALTER COLUMN [Descripcion] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_Pais] ALTER COLUMN [FormatoCP] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_Pais] ALTER COLUMN [FormatoIT] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_Pais] ALTER COLUMN [ValidacionIT] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_Pais] ALTER COLUMN [Agrupaciones] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_Pais] ALTER COLUMN [DIOTPais] [varchar](5) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_ProductosServicios] ALTER COLUMN [SATClavePS] [nvarchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_ProductosServicios] ALTER COLUMN [Descripcion] [nvarchar](600) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_ProductosServicios] ALTER COLUMN [IncluirIVAtrasladado] [nvarchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_ProductosServicios] ALTER COLUMN [IncluirIEPStrasladado] [nvarchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_ProductosServicios] ALTER COLUMN [ComplementoIncluir] [nvarchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_ProductosServicios] ALTER COLUMN [PalabrasSimilares] [varchar](600) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_ProductosServicios] ALTER COLUMN [MaterialPeligroso] [varchar](3) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_UnidadesMedida] ALTER COLUMN [SATClaveUnidadMedida] [nvarchar](255) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_UnidadesMedida] ALTER COLUMN [Nombre] [nvarchar](255) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_UnidadesMedida] ALTER COLUMN [Descripcion] [nvarchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_UnidadesMedida] ALTER COLUMN [Simbolo] [nvarchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Gral_SAT_UsosCFDI] ALTER COLUMN [UsoCFDI] [varchar](5) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_UsosCFDI] ALTER COLUMN [Descripcion] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Gral_SAT_UsosCFDI] ALTER COLUMN [RegimenFiscalReceptor] [varchar](200) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Inv_Almacenes] ALTER COLUMN [Almacen] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Inv_Almacenes] ALTER COLUMN [AlmacenAbreviatura] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Inv_TiposAlmacenes] ALTER COLUMN [TipoAlmacen] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [Codigo] [varchar](50) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [NumeroParte] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [CodigoBarras] [varchar](50) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [PS] [varchar](846) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [PSExtranjero] [varchar](846) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [Borrame] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [AlmacenSeccion] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [Imagen] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [ClaveImpuestoEmpaque] [varchar](3) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [ClaveImpuestoUM] [varchar](3) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [ClaveCategoriaToxicidad] [varchar](3) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [ClaveImpuestoTipoProducto] [varchar](3) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [Code17] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [Dimensiones] [varchar](25) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [RegistroRSCO] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [NombreComercial] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [NotasAdicionales] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [EcommerceEtiquetas] [varchar](200) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [CodigoAlterno] [varchar](50) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[ProductosServicios] ALTER COLUMN [PSAlterno] [varchar](846) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Proyectos] ALTER COLUMN [Proyecto] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sat_Bancos] ALTER COLUMN [CveBanco] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sat_Bancos] ALTER COLUMN [Banco] [varchar](150) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sat_Bancos] ALTER COLUMN [RazonSocial] [varchar](300) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Auditorias] ALTER COLUMN [TipoEvento] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Auditorias] ALTER COLUMN [NombreEntidad] [varchar](150) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Auditorias] ALTER COLUMN [LlaveEntidad] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Auditorias] ALTER COLUMN [Descripcion] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Auditorias] ALTER COLUMN [DireccionIP] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Auditorias] ALTER COLUMN [AgenteUsuario] [varchar](1000) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Auditorias] ALTER COLUMN [NombreDominio] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_AuditoriasDetalles] ALTER COLUMN [NombreCampo] [varchar](150) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_AuditoriasDetalles] ALTER COLUMN [ValorAnterior] [varchar](MAX) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_AuditoriasDetalles] ALTER COLUMN [ValorNuevo] [varchar](MAX) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_IntentosInicioSesion] ALTER COLUMN [NombreUsuario] [varchar](100) COLLATE Modern_Spanish_CI_AS NOT NULL;
ALTER TABLE [dbo].[Sis_IntentosInicioSesion] ALTER COLUMN [MotivoFallo] [varchar](200) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_IntentosInicioSesion] ALTER COLUMN [DireccionIP] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_IntentosInicioSesion] ALTER COLUMN [AgenteUsuario] [varchar](1000) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_IntentosInicioSesion] ALTER COLUMN [NombreDominio] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Modulos] ALTER COLUMN [NombreModulo] [varchar](150) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Modulos] ALTER COLUMN [Descripcion] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Modulos] ALTER COLUMN [Url] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Modulos] ALTER COLUMN [ClaseCssIcono] [varchar](150) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Modulos] ALTER COLUMN [ClaseCssEstilo] [varchar](150) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Notificaciones] ALTER COLUMN [TipoNotificacion] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Notificaciones] ALTER COLUMN [EstadoNotificacion] [varchar](30) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Notificaciones] ALTER COLUMN [Titulo] [varchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Notificaciones] ALTER COLUMN [Mensaje] [varchar](MAX) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Notificaciones] ALTER COLUMN [Url] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_NotificacionesEnvios] ALTER COLUMN [CanalEnvio] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_NotificacionesEnvios] ALTER COLUMN [EstadoEnvio] [varchar](30) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_NotificacionesEnvios] ALTER COLUMN [RespuestaProveedor] [varchar](MAX) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_NotificacionesEnvios] ALTER COLUMN [MensajeError] [varchar](MAX) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_PAC] ALTER COLUMN [PAC] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Permisos] ALTER COLUMN [CodigoPermiso] [varchar](100) COLLATE Modern_Spanish_CI_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Permisos] ALTER COLUMN [NombrePermiso] [varchar](150) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Permisos] ALTER COLUMN [Descripcion] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Plataformas] ALTER COLUMN [NombrePlataforma] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Plataformas] ALTER COLUMN [Descripcion] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_PoliticasLimpieza] ALTER COLUMN [Esquema] sysname COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_PoliticasLimpieza] ALTER COLUMN [Tabla] sysname COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Roles] ALTER COLUMN [NombreRol] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Roles] ALTER COLUMN [Descripcion] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_Usuarios] ALTER COLUMN [NombreUsuario] [varchar](100) COLLATE Modern_Spanish_CI_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Usuarios] ALTER COLUMN [HashContrasena] [varchar](500) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_Usuarios] ALTER COLUMN [CorreoElectronico] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_UsuariosAutorizaciones] ALTER COLUMN [EstadoAutorizacion] [varchar](30) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_UsuariosAutorizaciones] ALTER COLUMN [ComentarioSolicitud] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_UsuariosAutorizaciones] ALTER COLUMN [ComentarioAutorizacion] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_UsuariosSesiones] ALTER COLUMN [TokenSesion] [varchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_UsuariosSesiones] ALTER COLUMN [DireccionIP] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_UsuariosSesiones] ALTER COLUMN [AgenteUsuario] [varchar](1000) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_UsuariosSesiones] ALTER COLUMN [NombreDominio] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_UsuariosSuscripcionesPush] ALTER COLUMN [Endpoint] [varchar](1000) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_UsuariosSuscripcionesPush] ALTER COLUMN [P256DH] [varchar](500) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_UsuariosSuscripcionesPush] ALTER COLUMN [ClaveAutenticacion] [varchar](500) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Sis_UsuariosSuscripcionesPush] ALTER COLUMN [AgenteUsuario] [varchar](1000) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_UsuariosSuscripcionesPush] ALTER COLUMN [Plataforma] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_UsuariosSuscripcionesPush] ALTER COLUMN [Navegador] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_UsuariosSuscripcionesPush] ALTER COLUMN [NombreDominio] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Sis_UsuariosVerificacionesCorreo] ALTER COLUMN [HashToken] [char](64) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [ClaveSubProyecto] [varchar](5) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [SubProyecto] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [CuentaGasto] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Serie] [varchar](15) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Calle] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [NoExt] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [NoInt] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Colonia] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Localidad] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Municipio] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Pais] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [CP] [varchar](5) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Estado] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [FormatoFactura] [varchar](25) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [TipoFormato] [varchar](5) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Telefono] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Correo] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [CodigoSucursal] [varchar](20) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Acum_CentroServicio] [varchar](10) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Acum_PortalUsuario] [varchar](50) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[SubProyectos] ALTER COLUMN [Acum_PortalContrasena] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_CostosTramite] ALTER COLUMN [Descripcion] [varchar](300) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_DocumentosSolicitud] ALTER COLUMN [NombreArchivo] [varchar](255) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_DocumentosSolicitud] ALTER COLUMN [NombreArchivoFisico] [varchar](255) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_DocumentosSolicitud] ALTER COLUMN [RutaArchivo] [varchar](1000) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_DocumentosSolicitud] ALTER COLUMN [ContentType] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_DocumentosSolicitud] ALTER COLUMN [ComentarioCliente] [varchar](1000) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_DocumentosSolicitud] ALTER COLUMN [ComentarioAdministrativo] [varchar](1000) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_EstatusSolicitud] ALTER COLUMN [Codigo] [varchar](50) COLLATE Modern_Spanish_CI_AS NOT NULL;
ALTER TABLE [dbo].[Tra_EstatusSolicitud] ALTER COLUMN [EstatusSolicitud] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_HistorialEstatusSolicitud] ALTER COLUMN [Comentarios] [varchar](1000) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_NotasSolicitud] ALTER COLUMN [TipoNota] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_NotasSolicitud] ALTER COLUMN [Comentario] [varchar](MAX) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_OpcionesPregunta] ALTER COLUMN [TextoOpcion] [varchar](300) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_OpcionesPregunta] ALTER COLUMN [ValorOpcion] [varchar](300) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_Preguntas] ALTER COLUMN [Pregunta] [varchar](500) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_Preguntas] ALTER COLUMN [Descripcion] [varchar](1000) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_Preguntas] ALTER COLUMN [Codigo] [varchar](20) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[Tra_RespuestasSolicitud] ALTER COLUMN [Valor] [varchar](MAX) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_Solicitudes] ALTER COLUMN [Folio] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_Solicitudes] ALTER COLUMN [ComentariosCliente] [varchar](MAX) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_Solicitudes] ALTER COLUMN [ComentariosAdministrativos] [varchar](MAX) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_SolicitudesDependencias] ALTER COLUMN [Condicion] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_TiposDocumento] ALTER COLUMN [TipoDocumento] [varchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_TiposDocumento] ALTER COLUMN [Descripcion] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_TiposDocumento] ALTER COLUMN [ExtensionesPermitidas] [varchar](200) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Tra_TiposPregunta] ALTER COLUMN [TipoPregunta] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_TiposTramite] ALTER COLUMN [Codigo] [varchar](50) COLLATE Modern_Spanish_CI_AS NOT NULL;
ALTER TABLE [dbo].[Tra_TiposTramite] ALTER COLUMN [TipoTramite] [varchar](200) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Tra_TiposTramite] ALTER COLUMN [Descripcion] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[UnidadesMedida] ALTER COLUMN [UnidadMedida] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[UnidadesMedida] ALTER COLUMN [Abreviatura] [varchar](15) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[UnidadesMedida] ALTER COLUMN [Alias1] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[UnidadesMedida] ALTER COLUMN [Alias2] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[UnidadesMedida] ALTER COLUMN [Alias3] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[UnidadesMedida] ALTER COLUMN [Alias4] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[UnidadesMedida] ALTER COLUMN [CveImpEmpaque] [varchar](3) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[UnidadesMedida] ALTER COLUMN [CveImpUM] [varchar](3) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [FolioFiscal] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [TipoDocto] [varchar](3) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Serie] [varchar](10) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [MotivoDescuento] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Observaciones] [varchar](2000) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [MotivoCancelacion] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Alfa1] [varchar](500) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Alfa2] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Alfa3] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [SelloCancelacion] [varchar](800) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [AtencionA] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Det_OrdenCompra] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Det_FechaOrdenCompra] [varchar](15) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Ref] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [NumeroCuenta] [varchar](5) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Entrega] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [TiempoEntrega] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [TelefonoGenerico] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [PedidoContrato] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [ObservacionesAlmacen] [varchar](300) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [CobranzaObservacion] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [TipoProceso] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [TipoComite] [varchar](255) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [IdContabilidad] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [OrdenCompra] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [CorreoNotificacion] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [RFCReceptor] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Adjunto] [varchar](150) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [EstadoCancelacion] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [SelloSolicitudCancelacion] [varchar](800) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [CFDIVersion] [varchar](5) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [LineaAdicionalComprobante] [varchar](250) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [DescripcionVenta] [varchar](300) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Paciente] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Episodio] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [Addenda] [varchar](2000) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Ventas] ALTER COLUMN [ComplementoSAT] [varchar](2000) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [SucursalCliente] [varchar](100) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [Ciudad] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [Colonia] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [CP] [varchar](5) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [Direccion] [varchar](90) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [Estado] [varchar](35) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [Localidad] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [Pais] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [NoExt] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [NoInt] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [Telefono] [varchar](25) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [Correo] [varchar](300) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [Contacto] [varchar](300) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [CorreoCotizacion] [varchar](300) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [NumCtaPago] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [Punto] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_ClientesSucursales] ALTER COLUMN [RFC] [varchar](15) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_FormaPago] ALTER COLUMN [FormaPago] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_FormaPago] ALTER COLUMN [ClaveFormaPagoSAT] [varchar](2) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_MetodoPago] ALTER COLUMN [MetodoPago] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_MetodoPago] ALTER COLUMN [ClaveMetodoPagoSAT] [varchar](5) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_Pagos] ALTER COLUMN [Referencia] [varchar](200) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_Procedimientos] ALTER COLUMN [Procedimiento] [varchar](150) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Vta_TipoDocumentos] ALTER COLUMN [CveTipoDocumento] [varchar](3) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Vta_TipoDocumentos] ALTER COLUMN [TipoDocumento] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_Vendedores] ALTER COLUMN [Codigo] [varchar](10) COLLATE Modern_Spanish_CI_AS NULL;
ALTER TABLE [dbo].[Vta_Vendedores] ALTER COLUMN [Vendedor] [varchar](50) COLLATE Modern_Spanish_CS_AS NOT NULL;
ALTER TABLE [dbo].[Vta_Vendedores] ALTER COLUMN [Correo] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_Vendedores] ALTER COLUMN [Telefono] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_Vendedores] ALTER COLUMN [Celular] [varchar](50) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_Vendedores] ALTER COLUMN [TituloDocumentos] [varchar](150) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[Vta_Vendedores] ALTER COLUMN [CorreoAdicionalNotificaciones] [varchar](200) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ZonasHorarias] ALTER COLUMN [Abreviacion] [varchar](7) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ZonasHorarias] ALTER COLUMN [ZonaHoraria] [varchar](100) COLLATE Modern_Spanish_CS_AS NULL;
ALTER TABLE [dbo].[ZonasHorarias] ALTER COLUMN [UTC] [varchar](20) COLLATE Modern_Spanish_CS_AS NULL;
/* Recrear columnas calculadas */
ALTER TABLE [dbo].[Conta_PrePolizas] ADD [AnioMes] AS ((CONVERT([varchar](6),[Fecha],(112))) COLLATE Modern_Spanish_CS_AS) PERSISTED;
ALTER TABLE [dbo].[ProductosServicios] ADD [CodigoPS] AS ((case when len([Codigo])>(0) then concat([Codigo] COLLATE Modern_Spanish_CI_AS,' - ',[PS] COLLATE Modern_Spanish_CI_AS) else [PS] COLLATE Modern_Spanish_CI_AS end) COLLATE Modern_Spanish_CI_AS);
ALTER TABLE [dbo].[Ventas] ADD [SerieFolio] AS ((concat(case when [Serie]<>'' then [Serie]+'-' else '' end,[Folio])) COLLATE Modern_Spanish_CS_AS);
/* Recrear CHECK */
ALTER TABLE [dbo].[Bit_Bitacora] WITH CHECK ADD CONSTRAINT [CK_Bit_Bitacora_Autorizacion] CHECK ([CveUsuarioAutoriza] IS NOT NULL OR [FechaAutorizacion] IS NULL);
ALTER TABLE [dbo].[Bit_Bitacora] CHECK CONSTRAINT [CK_Bit_Bitacora_Autorizacion];
ALTER TABLE [dbo].[Bit_BitacoraRelaciones] WITH CHECK ADD CONSTRAINT [CK_Bit_BitacoraRelaciones_ValorRelacion] CHECK (NOT ([ValorRelacionNumero] IS NOT NULL AND [ValorRelacionTexto] IS NOT NULL));
ALTER TABLE [dbo].[Bit_BitacoraRelaciones] CHECK CONSTRAINT [CK_Bit_BitacoraRelaciones_ValorRelacion];
ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [CK_Clientes_RFC_Requerido] CHECK ([RFC]<>'');
ALTER TABLE [dbo].[Clientes] CHECK CONSTRAINT [CK_Clientes_RFC_Requerido];
ALTER TABLE [dbo].[Conta_Cuentas] WITH CHECK ADD CONSTRAINT [CK_Conta_Cuentas_Padre] CHECK ([CveCuentaPadre]<>[CveCuenta]);
ALTER TABLE [dbo].[Conta_Cuentas] CHECK CONSTRAINT [CK_Conta_Cuentas_Padre];
ALTER TABLE [dbo].[Conta_Cuentas] WITH CHECK ADD CONSTRAINT [CK_Conta_Cuentas_Padre_Requerido] CHECK ([CveCuentaPadre] IS NOT NULL OR ([Codigo]='_ORDEN' OR [Codigo]='_ESTADISTICAS' OR [Codigo]='_GLOBAL'));
ALTER TABLE [dbo].[Conta_Cuentas] CHECK CONSTRAINT [CK_Conta_Cuentas_Padre_Requerido];
ALTER TABLE [dbo].[Conta_PrePolizas] WITH CHECK ADD CONSTRAINT [CK_Conta_PrePolizas_Concepto] CHECK (rtrim([Concepto])<>'');
ALTER TABLE [dbo].[Conta_PrePolizas] CHECK CONSTRAINT [CK_Conta_PrePolizas_Concepto];
ALTER TABLE [dbo].[Conta_PrePolizas] WITH CHECK ADD CONSTRAINT [CK_Conta_PrePolizas_Fecha_2000_2050] CHECK ([Fecha]>='2000-01-01' AND [Fecha]<='2050/12/31');
ALTER TABLE [dbo].[Conta_PrePolizas] CHECK CONSTRAINT [CK_Conta_PrePolizas_Fecha_2000_2050];
ALTER TABLE [dbo].[Conta_PrePolizas] WITH CHECK ADD CONSTRAINT [CK_Conta_PrePolizas_FolioPoliza] CHECK ([IdPoliza]>(0) AND isnull([FolioPoliza],(0))>(0) OR ([IdPoliza] IS NULL OR [IdPoliza]=(0)));
ALTER TABLE [dbo].[Conta_PrePolizas] CHECK CONSTRAINT [CK_Conta_PrePolizas_FolioPoliza];
ALTER TABLE [dbo].[Fraccionamientos] WITH CHECK ADD CONSTRAINT [CK_Fraccionamientos_Hectareas] CHECK ([Hectareas] IS NULL OR [Hectareas]>=(0));
ALTER TABLE [dbo].[Fraccionamientos] CHECK CONSTRAINT [CK_Fraccionamientos_Hectareas];
ALTER TABLE [dbo].[FraccionamientosEtapas] WITH CHECK ADD CONSTRAINT [CK_FraccionamientosEtapas_Hectareas] CHECK ([Hectareas] IS NULL OR [Hectareas]>=(0));
ALTER TABLE [dbo].[FraccionamientosEtapas] CHECK CONSTRAINT [CK_FraccionamientosEtapas_Hectareas];
ALTER TABLE [dbo].[FraccionamientosLotes] WITH CHECK ADD CONSTRAINT [CK_FraccionamientosLotes_MetrosCuadrados] CHECK ([MetrosCuadrados] IS NULL OR [MetrosCuadrados]>=(0));
ALTER TABLE [dbo].[FraccionamientosLotes] CHECK CONSTRAINT [CK_FraccionamientosLotes_MetrosCuadrados];
ALTER TABLE [dbo].[ProductosServicios] WITH CHECK ADD CONSTRAINT [CK_AsientoContableCompras] CHECK ([AsientoContableCompras]=(3) OR [AsientoContableCompras]=(2) OR [AsientoContableCompras]=(1));
ALTER TABLE [dbo].[ProductosServicios] CHECK CONSTRAINT [CK_AsientoContableCompras];
ALTER TABLE [dbo].[ProductosServicios] WITH CHECK ADD CONSTRAINT [CK_AsientoContableVentas] CHECK ([AsientoContableVentas]=(2) OR [AsientoContableVentas]=(1));
ALTER TABLE [dbo].[ProductosServicios] CHECK CONSTRAINT [CK_AsientoContableVentas];
ALTER TABLE [dbo].[ProductosServicios] WITH CHECK ADD CONSTRAINT [CK_ProductosServicios_IVA] CHECK ([IVA]=(-1) OR [IVA]=(0) OR [IVA] IS NULL);
ALTER TABLE [dbo].[ProductosServicios] CHECK CONSTRAINT [CK_ProductosServicios_IVA];
ALTER TABLE [dbo].[Sis_Notificaciones] WITH CHECK ADD CONSTRAINT [CK_Sis_Notificaciones_Estado] CHECK ([EstadoNotificacion]='Cancelada' OR [EstadoNotificacion]='Fallida' OR [EstadoNotificacion]='Enviada' OR [EstadoNotificacion]='Pendiente');
ALTER TABLE [dbo].[Sis_Notificaciones] CHECK CONSTRAINT [CK_Sis_Notificaciones_Estado];
ALTER TABLE [dbo].[Sis_Notificaciones] WITH CHECK ADD CONSTRAINT [CK_Sis_Notificaciones_Tipo] CHECK ([TipoNotificacion]='Campana' OR [TipoNotificacion]='Push' OR [TipoNotificacion]='Correo' OR [TipoNotificacion]='SignalR' OR [TipoNotificacion]='WhatsApp' OR [TipoNotificacion]='Local');
ALTER TABLE [dbo].[Sis_Notificaciones] CHECK CONSTRAINT [CK_Sis_Notificaciones_Tipo];
ALTER TABLE [dbo].[Sis_NotificacionesEnvios] WITH CHECK ADD CONSTRAINT [CK_Sis_NotificacionesEnvios_Canal] CHECK ([CanalEnvio]='Campana' OR [CanalEnvio]='Push' OR [CanalEnvio]='Correo' OR [CanalEnvio]='SignalR' OR [CanalEnvio]='WhatsApp' OR [CanalEnvio]='Local');
ALTER TABLE [dbo].[Sis_NotificacionesEnvios] CHECK CONSTRAINT [CK_Sis_NotificacionesEnvios_Canal];
ALTER TABLE [dbo].[Sis_NotificacionesEnvios] WITH CHECK ADD CONSTRAINT [CK_Sis_NotificacionesEnvios_Estado] CHECK ([EstadoEnvio]='Cancelado' OR [EstadoEnvio]='Fallido' OR [EstadoEnvio]='Enviado' OR [EstadoEnvio]='Pendiente');
ALTER TABLE [dbo].[Sis_NotificacionesEnvios] CHECK CONSTRAINT [CK_Sis_NotificacionesEnvios_Estado];
ALTER TABLE [dbo].[Sis_PoliticasLimpieza] WITH CHECK ADD CONSTRAINT [CK_Sis_PoliticasLimpieza_DiasRetencion] CHECK ([DiasRetencion]>=(30) AND [DiasRetencion]<=(3650));
ALTER TABLE [dbo].[Sis_PoliticasLimpieza] CHECK CONSTRAINT [CK_Sis_PoliticasLimpieza_DiasRetencion];
ALTER TABLE [dbo].[Sis_PoliticasLimpieza] WITH CHECK ADD CONSTRAINT [CK_Sis_PoliticasLimpieza_TamanoLote] CHECK ([TamanoLote]>=(1) AND [TamanoLote]<=(10000));
ALTER TABLE [dbo].[Sis_PoliticasLimpieza] CHECK CONSTRAINT [CK_Sis_PoliticasLimpieza_TamanoLote];
ALTER TABLE [dbo].[Sis_UsuariosAutorizaciones] WITH CHECK ADD CONSTRAINT [CK_Sis_UsuariosAutorizaciones_Estado] CHECK ([EstadoAutorizacion]='Cancelada' OR [EstadoAutorizacion]='Rechazada' OR [EstadoAutorizacion]='Aprobada' OR [EstadoAutorizacion]='Pendiente');
ALTER TABLE [dbo].[Sis_UsuariosAutorizaciones] CHECK CONSTRAINT [CK_Sis_UsuariosAutorizaciones_Estado];
ALTER TABLE [dbo].[Tra_CostosTramite] WITH CHECK ADD CONSTRAINT [CK_Tra_CostosTramite_Importe] CHECK ([Importe]>=(0));
ALTER TABLE [dbo].[Tra_CostosTramite] CHECK CONSTRAINT [CK_Tra_CostosTramite_Importe];
ALTER TABLE [dbo].[Tra_CostosTramite] WITH CHECK ADD CONSTRAINT [CK_Tra_CostosTramite_Vigencia] CHECK ([FechaFinVigencia] IS NULL OR [FechaInicioVigencia] IS NULL OR [FechaFinVigencia]>=[FechaInicioVigencia]);
ALTER TABLE [dbo].[Tra_CostosTramite] CHECK CONSTRAINT [CK_Tra_CostosTramite_Vigencia];
ALTER TABLE [dbo].[Tra_DocumentosSolicitud] WITH CHECK ADD CONSTRAINT [CK_Tra_DocumentosSolicitud_Tamano] CHECK ([TamanoBytes] IS NULL OR [TamanoBytes]>=(0));
ALTER TABLE [dbo].[Tra_DocumentosSolicitud] CHECK CONSTRAINT [CK_Tra_DocumentosSolicitud_Tamano];
ALTER TABLE [dbo].[Tra_RespuestasSolicitud] WITH CHECK ADD CONSTRAINT [CK_Tra_RespuestasSolicitud_Valor] CHECK ([CveOpcionPregunta] IS NOT NULL OR [Valor] IS NOT NULL);
ALTER TABLE [dbo].[Tra_RespuestasSolicitud] CHECK CONSTRAINT [CK_Tra_RespuestasSolicitud_Valor];
ALTER TABLE [dbo].[Tra_SolicitudesDependencias] WITH CHECK ADD CONSTRAINT [CK_Tra_SolicitudesDependencias_Diferentes] CHECK ([CveSolicitud]<>[CveSolicitudRequerida]);
ALTER TABLE [dbo].[Tra_SolicitudesDependencias] CHECK CONSTRAINT [CK_Tra_SolicitudesDependencias_Diferentes];
ALTER TABLE [dbo].[Tra_TiposDocumento] WITH CHECK ADD CONSTRAINT [CK_Tra_TiposDocumento_Tamano] CHECK ([TamanoMaximoMb] IS NULL OR [TamanoMaximoMb]>(0));
ALTER TABLE [dbo].[Tra_TiposDocumento] CHECK CONSTRAINT [CK_Tra_TiposDocumento_Tamano];
ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CHK_VentasMail] CHECK ([EnvioMail]=(3) OR [EnvioMail]=(2) OR [EnvioMail]=(1) OR [EnvioMail]=(0));
ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CHK_VentasMail];
ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas] CHECK ([TipoDocto]='Egs' OR [TipoDocto]='Dev' OR [TipoDocto]='Ing' OR [TipoDocto]='Cot' OR [TipoDocto]='Rem' OR [TipoDocto]='Ped' OR [TipoDocto]='DPe' OR [TipoDocto]='Com' OR [TipoDocto]='OP' OR [TipoDocto]='Nom' OR [TipoDocto]='Ant' OR [TipoDocto]='PeC' OR [TipoDocto]='Pd2' OR [TipoDocto]='PA' OR [TipoDocto]='RNC' OR [TipoDocto]='Rmm');
ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas];
ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_1] CHECK ([CveCliente]>(0));
ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_1];
ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_Dev_CveVentaPadre] CHECK ([TipoDocto]='Dev' AND [CveVentaPadre]>(0) OR [TipoDocto]<>'Dev');
ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_Dev_CveVentaPadre];
ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_FechaEjecucion_MinMax] CHECK ([FechaEjecucion]>'1900-01-01' AND [FechaEjecucion]<'2900-12-31');
ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_FechaEjecucion_MinMax];
ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_Moneda_TipoCambio] CHECK ([CveMoneda]>=(2) AND [TipoCambio]>=(10) OR [CveMoneda]=(1) AND [TipoCambio]=(1));
ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_Moneda_TipoCambio];
ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_TMp_AlmacenInactivo] CHECK ([CveAlmacenTraspasoDestino]<>(172) AND [CveVenta]>(1012251) OR [CveVenta]<=(1012251));
ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_TMp_AlmacenInactivo];
ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_Total] CHECK (datepart(year,[Fecha])>=(2018) AND abs(round([Total],(2))-round(((((((isnull([SubTotal],(0))+isnull([IVA],(0)))+isnull([IEPS],(0)))-isnull([Amortizacion],(0)))-isnull([RetIVA],(0)))-isnull([RetISR],(0)))-isnull([Descuento],(0)))-isnull([ImpuestoLocal],(0)),(2)))<(200.02) OR datepart(year,[Fecha])<(2018));
ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_Total];
ALTER TABLE [dbo].[Vta_Pagos] WITH CHECK ADD CONSTRAINT [CK_Vta_Pagos_Importe] CHECK ([Importe]>(0));
ALTER TABLE [dbo].[Vta_Pagos] CHECK CONSTRAINT [CK_Vta_Pagos_Importe];
ALTER TABLE [dbo].[Vta_Pagos] WITH CHECK ADD CONSTRAINT [CK_Vta_Pagos_SaldoFavor] CHECK ([EsSaldoFavor]=(0) OR [CveSolicitud] IS NULL);
ALTER TABLE [dbo].[Vta_Pagos] CHECK CONSTRAINT [CK_Vta_Pagos_SaldoFavor];
/* Recrear índices */
ALTER TABLE [dbo].[Banc_Bancos] ADD CONSTRAINT [UN_Bancos] UNIQUE NONCLUSTERED ([Banco] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Banc_BancosCuentas] ADD CONSTRAINT [UN_Banc_BancosCuentas] UNIQUE NONCLUSTERED ([CveBanco] ASC, [NumCuenta] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Banc_TiposCuenta] ADD CONSTRAINT [UN_BancTipoCuenta] UNIQUE NONCLUSTERED ([TipoCuenta] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IX_Bit_Bitacora_Tabla_Llave_Fecha] ON [dbo].[Bit_Bitacora] ([CveTabla] ASC, [LlaveRegistro] ASC, [FechaMovimiento] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IX_Bit_BitacoraRelaciones_Tabla_Llave] ON [dbo].[Bit_BitacoraRelaciones] ([CveTablaRelacionada] ASC, [LlaveRegistroRelacionada] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IX_Bit_BitacoraRelaciones_Filtro] ON [dbo].[Bit_BitacoraRelaciones] ([CveTablaRelacionada] ASC, [CveCampoRelacion] ASC, [ValorRelacionNumero] ASC, [VisibleDesarrollador] ASC, [CveBitacora] ASC) INCLUDE ([ValorRelacionTexto], [LlaveRegistroRelacionada]) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IX_Bit_BitacoraRelaciones_FiltroTexto] ON [dbo].[Bit_BitacoraRelaciones] ([CveTablaRelacionada] ASC, [CveCampoRelacion] ASC, [ValorRelacionTexto] ASC, [VisibleDesarrollador] ASC, [CveBitacora] ASC) INCLUDE ([ValorRelacionNumero], [LlaveRegistroRelacionada]) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Bit_Campos] ADD CONSTRAINT [UQ_Bit_Campos_Tabla_Campo] UNIQUE NONCLUSTERED ([CveTabla] ASC, [NombreCampoSQL] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Bit_DefinicionesAccion] ADD CONSTRAINT [UQ_Bit_DefinicionesAccion] UNIQUE NONCLUSTERED ([CveTabla] ASC, [CveTipoMovimiento] ASC, [NombreAccion] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Bit_Tablas] ADD CONSTRAINT [UQ_Bit_Tablas_NombreTablaSQL] UNIQUE NONCLUSTERED ([NombreTablaSQL] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Bit_TiposMovimiento] ADD CONSTRAINT [UQ_Bit_TiposMovimiento_Nombre] UNIQUE NONCLUSTERED ([Nombre] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Bit_TiposRelacion] ADD CONSTRAINT [UQ_Bit_TiposRelacion_Nombre] UNIQUE NONCLUSTERED ([Nombre] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Clasificaciones] ADD CONSTRAINT [UN_Clasificacion] UNIQUE NONCLUSTERED ([Clasificacion] ASC, [Codigo] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Conta_ConceptosContables] ADD CONSTRAINT [UN_Conta_ConceptosContables] UNIQUE NONCLUSTERED ([ConceptoContable] ASC, [Tipo] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Conta_TiposPoliza] ADD CONSTRAINT [UN_ContaTipoPoliza] UNIQUE NONCLUSTERED ([TipoPoliza] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Fraccionamientos] ADD CONSTRAINT [UQ_Fraccionamientos_Cliente_Nombre] UNIQUE NONCLUSTERED ([CveCliente] ASC, [Fraccionamiento] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[FraccionamientosEtapas] ADD CONSTRAINT [UQ_FraccionamientosEtapas_Fraccionamiento_Etapa] UNIQUE NONCLUSTERED ([CveFraccionamiento] ASC, [Etapa] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IX_FraccionamientosLotes_Etapa] ON [dbo].[FraccionamientosLotes] ([CveFraccionamientoEtapa] ASC) INCLUDE ([Numero], [Tipo], [Calle], [Catastro], [MetrosCuadrados], [Duplicador], [EsActivo]) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Gral_Categorias] ADD CONSTRAINT [UK_Gral_Categorias] UNIQUE NONCLUSTERED ([Categoria] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Gral_Monedas] ADD CONSTRAINT [UN_Moneda] UNIQUE NONCLUSTERED ([Moneda] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IND_Gral_SAT_Colonia_CP] ON [dbo].[Gral_SAT_Colonia] ([CP] ASC) INCLUDE ([CveColonia], [ClaveSATColonia], [NombreAsentamiento]) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IX_Gral_SAT_Colonia_CP_Vigente] ON [dbo].[Gral_SAT_Colonia] ([CP] ASC) INCLUDE ([CveColonia], [ClaveSATColonia], [NombreAsentamiento]) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IND_Gral_SAT_CP_ClaveSATEstado] ON [dbo].[Gral_SAT_CP] ([CP] ASC) INCLUDE ([ClaveSATEstado]) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Gral_SAT_CP] ADD CONSTRAINT [UQ_Gral_SAT_CP_CP] UNIQUE NONCLUSTERED ([CP] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IX_Gral_SAT_CP_BusquedaRegistro] ON [dbo].[Gral_SAT_CP] ([CP] ASC) INCLUDE ([CveCP], [ClaveSATEstado], [ClaveSATMunicipio], [ClaveSATLocalidad]) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IX_Gral_SAT_Localidad_Claves_Vigente] ON [dbo].[Gral_SAT_Localidad] ([ClaveSATEstado] ASC, [ClaveSATLocalidad] ASC) INCLUDE ([CveLocalidad], [NombreLocalidad]) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IX_Gral_SAT_Municipio_Claves_Vigente] ON [dbo].[Gral_SAT_Municipio] ([ClaveSATEstado] ASC, [ClaveSATMunicipio] ASC) INCLUDE ([CveMunicipio], [Descripcion]) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Gral_SAT_UnidadesMedida] ADD CONSTRAINT [UK_Gral_SAT_UnidadesMedida] UNIQUE NONCLUSTERED ([SATClaveUnidadMedida] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Inv_Almacenes] ADD CONSTRAINT [UN_INV_Almacenes] UNIQUE NONCLUSTERED ([Almacen] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Inv_TiposAlmacenes] ADD CONSTRAINT [UN_INV_TiposAlmacenes] UNIQUE NONCLUSTERED ([TipoAlmacen] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Proyectos] ADD CONSTRAINT [UN_Proyectos] UNIQUE NONCLUSTERED ([Proyecto] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Sat_Bancos] ADD CONSTRAINT [UQ_Sat_Bancos_CveBanco] UNIQUE NONCLUSTERED ([CveBanco] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE NONCLUSTERED INDEX [IX_Sis_IntentosInicioSesion_NombreUsuario_FechaCreacion] ON [dbo].[Sis_IntentosInicioSesion] ([NombreUsuario] ASC, [FechaCreacion] DESC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Sis_Permisos] ADD CONSTRAINT [UQ_Sis_Permisos_CodigoPermiso] UNIQUE NONCLUSTERED ([CodigoPermiso] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Sis_Plataformas] ADD CONSTRAINT [UQ_Sis_Plataformas_NombrePlataforma] UNIQUE NONCLUSTERED ([NombrePlataforma] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Sis_PoliticasLimpieza] ADD CONSTRAINT [PK_Sis_PoliticasLimpieza] PRIMARY KEY CLUSTERED ([Esquema] ASC, [Tabla] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Sis_Roles] ADD CONSTRAINT [UQ_Sis_Roles_NombreRol] UNIQUE NONCLUSTERED ([NombreRol] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Sis_Usuarios] ADD CONSTRAINT [UQ_Sis_Usuarios_NombreUsuario] UNIQUE NONCLUSTERED ([NombreUsuario] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE UNIQUE NONCLUSTERED INDEX [UQ_Sis_Usuarios_CorreoElectronico] ON [dbo].[Sis_Usuarios] ([CorreoElectronico] ASC) WHERE ([CorreoElectronico] IS NOT NULL) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Sis_UsuariosSesiones] ADD CONSTRAINT [UQ_Sis_UsuariosSesiones_TokenSesion] UNIQUE NONCLUSTERED ([TokenSesion] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Sis_UsuariosVerificacionesCorreo] ADD CONSTRAINT [UQ_Sis_UsuariosVerificacionesCorreo_HashToken] UNIQUE NONCLUSTERED ([HashToken] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[SubProyectos] ADD CONSTRAINT [UN_SubProyectos] UNIQUE NONCLUSTERED ([CveProyecto] ASC, [SubProyecto] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Tra_EstatusSolicitud] ADD CONSTRAINT [UQ_Tra_EstatusSolicitud_Codigo] UNIQUE NONCLUSTERED ([Codigo] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Tra_OpcionesPregunta] ADD CONSTRAINT [UQ_Tra_OpcionesPregunta_Pregunta_Texto] UNIQUE NONCLUSTERED ([CvePregunta] ASC, [TextoOpcion] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
CREATE UNIQUE NONCLUSTERED INDEX [UX_Tra_Preguntas_Codigo] ON [dbo].[Tra_Preguntas] ([Codigo] ASC) WHERE ([Codigo] IS NOT NULL) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Tra_Solicitudes] ADD CONSTRAINT [UQ_Tra_Solicitudes_Folio] UNIQUE NONCLUSTERED ([Folio] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Tra_TiposDocumento] ADD CONSTRAINT [UQ_Tra_TiposDocumento_Nombre] UNIQUE NONCLUSTERED ([TipoDocumento] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Tra_TiposTramite] ADD CONSTRAINT [UQ_Tra_TiposTramite_Codigo] UNIQUE NONCLUSTERED ([Codigo] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[UnidadesMedida] ADD CONSTRAINT [UN_UnidadesMedida] UNIQUE NONCLUSTERED ([Abreviatura] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Ventas] ADD CONSTRAINT [UK_Ventas_TipoDocto_Serie_Folio_CveSubProyecto] UNIQUE NONCLUSTERED ([CveSubProyecto] ASC, [TipoDocto] ASC, [Serie] ASC, [Folio] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Vta_ClientesSucursales] ADD CONSTRAINT [UN_Vta_ClientesSucursales] UNIQUE NONCLUSTERED ([CveCliente] ASC, [SucursalCliente] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
ALTER TABLE [dbo].[Vta_TipoDocumentos] ADD CONSTRAINT [PK_Vta_TipoDocumentos] PRIMARY KEY CLUSTERED ([CveTipoDocumento] ASC) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
/* Recrear estadísticas */
/* Recrear llaves foráneas */
ALTER TABLE [dbo].[EstatusFactura] WITH CHECK ADD CONSTRAINT [FK_EstatusFactura_Vta_TipoDocumentos] FOREIGN KEY ([TipoDocto]) REFERENCES [dbo].[Vta_TipoDocumentos] ([CveTipoDocumento]);
ALTER TABLE [dbo].[EstatusFactura] CHECK CONSTRAINT [FK_EstatusFactura_Vta_TipoDocumentos];
ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [FK_Ventas_Vta_TipoDocumentos] FOREIGN KEY ([TipoDocto]) REFERENCES [dbo].[Vta_TipoDocumentos] ([CveTipoDocumento]);
ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [FK_Ventas_Vta_TipoDocumentos];
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO
/* Después ejecute Migracion_Collation_Default_CS_AS_Dependencias_20260723.sql. */

View File

@@ -0,0 +1,177 @@
SET NOCOUNT ON;
SET XACT_ABORT ON;
USE [master];
ALTER DATABASE [SIG_PlataformaDesarolladores] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
BEGIN TRY
USE [SIG_PlataformaDesarolladores];
/* Retirar dependencias del COLLATE predeterminado. */
IF EXISTS(SELECT 1 FROM sys.indexes WHERE object_id=OBJECT_ID(N'dbo.Sis_UsuariosClientes') AND name=N'UX_Sis_UsuariosClientes_Usuario_Orden') DROP INDEX [UX_Sis_UsuariosClientes_Usuario_Orden] ON [dbo].[Sis_UsuariosClientes];
IF EXISTS(SELECT 1 FROM sys.indexes WHERE object_id=OBJECT_ID(N'dbo.Sis_Usuarios') AND name=N'UQ_Sis_Usuarios_CorreoElectronico') DROP INDEX [UQ_Sis_Usuarios_CorreoElectronico] ON [dbo].[Sis_Usuarios];
IF EXISTS(SELECT 1 FROM sys.indexes WHERE object_id=OBJECT_ID(N'dbo.Tra_Preguntas') AND name=N'UX_Tra_Preguntas_Codigo') DROP INDEX [UX_Tra_Preguntas_Codigo] ON [dbo].[Tra_Preguntas];
IF OBJECT_ID(N'dbo.CK_Tra_DocumentosSolicitud_Tamano', N'C') IS NOT NULL ALTER TABLE [dbo].[Tra_DocumentosSolicitud] DROP CONSTRAINT [CK_Tra_DocumentosSolicitud_Tamano];
IF OBJECT_ID(N'dbo.CK_Sis_NotificacionesEnvios_Canal', N'C') IS NOT NULL ALTER TABLE [dbo].[Sis_NotificacionesEnvios] DROP CONSTRAINT [CK_Sis_NotificacionesEnvios_Canal];
IF OBJECT_ID(N'dbo.CK_Sis_NotificacionesEnvios_Estado', N'C') IS NOT NULL ALTER TABLE [dbo].[Sis_NotificacionesEnvios] DROP CONSTRAINT [CK_Sis_NotificacionesEnvios_Estado];
IF OBJECT_ID(N'dbo.CK_Tra_RespuestasSolicitud_Valor', N'C') IS NOT NULL ALTER TABLE [dbo].[Tra_RespuestasSolicitud] DROP CONSTRAINT [CK_Tra_RespuestasSolicitud_Valor];
IF OBJECT_ID(N'dbo.CK_Sis_UsuariosClientes_Orden', N'C') IS NOT NULL ALTER TABLE [dbo].[Sis_UsuariosClientes] DROP CONSTRAINT [CK_Sis_UsuariosClientes_Orden];
IF OBJECT_ID(N'dbo.CK_Tra_CostosTramite_Importe', N'C') IS NOT NULL ALTER TABLE [dbo].[Tra_CostosTramite] DROP CONSTRAINT [CK_Tra_CostosTramite_Importe];
IF OBJECT_ID(N'dbo.CK_Tra_CostosTramite_Vigencia', N'C') IS NOT NULL ALTER TABLE [dbo].[Tra_CostosTramite] DROP CONSTRAINT [CK_Tra_CostosTramite_Vigencia];
IF OBJECT_ID(N'dbo.CK_Bit_Bitacora_Autorizacion', N'C') IS NOT NULL ALTER TABLE [dbo].[Bit_Bitacora] DROP CONSTRAINT [CK_Bit_Bitacora_Autorizacion];
IF OBJECT_ID(N'dbo.CK_VentasDetalle_FondoInicial', N'C') IS NOT NULL ALTER TABLE [dbo].[VentasDetalle] DROP CONSTRAINT [CK_VentasDetalle_FondoInicial];
IF OBJECT_ID(N'dbo.CK_VentasDetalle_Importes', N'C') IS NOT NULL ALTER TABLE [dbo].[VentasDetalle] DROP CONSTRAINT [CK_VentasDetalle_Importes];
IF OBJECT_ID(N'dbo.CK_Vta_Pagos_Importe', N'C') IS NOT NULL ALTER TABLE [dbo].[Vta_Pagos] DROP CONSTRAINT [CK_Vta_Pagos_Importe];
IF OBJECT_ID(N'dbo.CK_Vta_Pagos_SaldoFavor', N'C') IS NOT NULL ALTER TABLE [dbo].[Vta_Pagos] DROP CONSTRAINT [CK_Vta_Pagos_SaldoFavor];
IF OBJECT_ID(N'dbo.CK_Bit_BitacoraRelaciones_ValorRelacion', N'C') IS NOT NULL ALTER TABLE [dbo].[Bit_BitacoraRelaciones] DROP CONSTRAINT [CK_Bit_BitacoraRelaciones_ValorRelacion];
IF OBJECT_ID(N'dbo.CK_Vta_AplicacionesSaldoFavor_Importe', N'C') IS NOT NULL ALTER TABLE [dbo].[Vta_AplicacionesSaldoFavor] DROP CONSTRAINT [CK_Vta_AplicacionesSaldoFavor_Importe];
IF OBJECT_ID(N'dbo.CHK_VentasMail', N'C') IS NOT NULL ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CHK_VentasMail];
IF OBJECT_ID(N'dbo.CK_Ventas', N'C') IS NOT NULL ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas];
IF OBJECT_ID(N'dbo.CK_Ventas_1', N'C') IS NOT NULL ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_1];
IF OBJECT_ID(N'dbo.CK_Ventas_Dev_CveVentaPadre', N'C') IS NOT NULL ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_Dev_CveVentaPadre];
IF OBJECT_ID(N'dbo.CK_Ventas_FechaEjecucion_MinMax', N'C') IS NOT NULL ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_FechaEjecucion_MinMax];
IF OBJECT_ID(N'dbo.CK_Ventas_Moneda_TipoCambio', N'C') IS NOT NULL ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_Moneda_TipoCambio];
IF OBJECT_ID(N'dbo.CK_Ventas_TMp_AlmacenInactivo', N'C') IS NOT NULL ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_TMp_AlmacenInactivo];
IF OBJECT_ID(N'dbo.CK_Ventas_Total', N'C') IS NOT NULL ALTER TABLE [dbo].[Ventas] DROP CONSTRAINT [CK_Ventas_Total];
IF OBJECT_ID(N'dbo.CK_Conta_Cuentas_Padre', N'C') IS NOT NULL ALTER TABLE [dbo].[Conta_Cuentas] DROP CONSTRAINT [CK_Conta_Cuentas_Padre];
IF OBJECT_ID(N'dbo.CK_Conta_Cuentas_Padre_Requerido', N'C') IS NOT NULL ALTER TABLE [dbo].[Conta_Cuentas] DROP CONSTRAINT [CK_Conta_Cuentas_Padre_Requerido];
IF OBJECT_ID(N'dbo.CK_Fraccionamientos_Hectareas', N'C') IS NOT NULL ALTER TABLE [dbo].[Fraccionamientos] DROP CONSTRAINT [CK_Fraccionamientos_Hectareas];
IF OBJECT_ID(N'dbo.CK_Clientes_RFC_Requerido', N'C') IS NOT NULL ALTER TABLE [dbo].[Clientes] DROP CONSTRAINT [CK_Clientes_RFC_Requerido];
IF OBJECT_ID(N'dbo.CK_FraccionamientosEtapas_Hectareas', N'C') IS NOT NULL ALTER TABLE [dbo].[FraccionamientosEtapas] DROP CONSTRAINT [CK_FraccionamientosEtapas_Hectareas];
IF OBJECT_ID(N'dbo.CK_FraccionamientosLotes_MetrosCuadrados', N'C') IS NOT NULL ALTER TABLE [dbo].[FraccionamientosLotes] DROP CONSTRAINT [CK_FraccionamientosLotes_MetrosCuadrados];
IF OBJECT_ID(N'dbo.CK_Tra_TiposDocumento_Tamano', N'C') IS NOT NULL ALTER TABLE [dbo].[Tra_TiposDocumento] DROP CONSTRAINT [CK_Tra_TiposDocumento_Tamano];
IF OBJECT_ID(N'dbo.CK_Conta_PrePolizas_Concepto', N'C') IS NOT NULL ALTER TABLE [dbo].[Conta_PrePolizas] DROP CONSTRAINT [CK_Conta_PrePolizas_Concepto];
IF OBJECT_ID(N'dbo.CK_Conta_PrePolizas_Fecha_2000_2050', N'C') IS NOT NULL ALTER TABLE [dbo].[Conta_PrePolizas] DROP CONSTRAINT [CK_Conta_PrePolizas_Fecha_2000_2050];
IF OBJECT_ID(N'dbo.CK_Conta_PrePolizas_FolioPoliza', N'C') IS NOT NULL ALTER TABLE [dbo].[Conta_PrePolizas] DROP CONSTRAINT [CK_Conta_PrePolizas_FolioPoliza];
IF OBJECT_ID(N'dbo.CK_Sis_PoliticasLimpieza_DiasRetencion', N'C') IS NOT NULL ALTER TABLE [dbo].[Sis_PoliticasLimpieza] DROP CONSTRAINT [CK_Sis_PoliticasLimpieza_DiasRetencion];
IF OBJECT_ID(N'dbo.CK_Sis_PoliticasLimpieza_TamanoLote', N'C') IS NOT NULL ALTER TABLE [dbo].[Sis_PoliticasLimpieza] DROP CONSTRAINT [CK_Sis_PoliticasLimpieza_TamanoLote];
IF OBJECT_ID(N'dbo.CK_Sis_UsuariosAutorizaciones_Estado', N'C') IS NOT NULL ALTER TABLE [dbo].[Sis_UsuariosAutorizaciones] DROP CONSTRAINT [CK_Sis_UsuariosAutorizaciones_Estado];
IF OBJECT_ID(N'dbo.CK_Tra_SolicitudesDependencias_Diferentes', N'C') IS NOT NULL ALTER TABLE [dbo].[Tra_SolicitudesDependencias] DROP CONSTRAINT [CK_Tra_SolicitudesDependencias_Diferentes];
IF OBJECT_ID(N'dbo.CK_AsientoContableCompras', N'C') IS NOT NULL ALTER TABLE [dbo].[ProductosServicios] DROP CONSTRAINT [CK_AsientoContableCompras];
IF OBJECT_ID(N'dbo.CK_AsientoContableVentas', N'C') IS NOT NULL ALTER TABLE [dbo].[ProductosServicios] DROP CONSTRAINT [CK_AsientoContableVentas];
IF OBJECT_ID(N'dbo.CK_ProductosServicios_IVA', N'C') IS NOT NULL ALTER TABLE [dbo].[ProductosServicios] DROP CONSTRAINT [CK_ProductosServicios_IVA];
IF OBJECT_ID(N'dbo.CK_Sis_Notificaciones_Estado', N'C') IS NOT NULL ALTER TABLE [dbo].[Sis_Notificaciones] DROP CONSTRAINT [CK_Sis_Notificaciones_Estado];
IF OBJECT_ID(N'dbo.CK_Sis_Notificaciones_Tipo', N'C') IS NOT NULL ALTER TABLE [dbo].[Sis_Notificaciones] DROP CONSTRAINT [CK_Sis_Notificaciones_Tipo];
IF COL_LENGTH(N'dbo.Banc_CreditosDetalle', N'IVA') IS NOT NULL ALTER TABLE [dbo].[Banc_CreditosDetalle] DROP COLUMN [IVA];
IF COL_LENGTH(N'dbo.Banc_CreditosDetalle', N'Total') IS NOT NULL ALTER TABLE [dbo].[Banc_CreditosDetalle] DROP COLUMN [Total];
IF COL_LENGTH(N'dbo.Ventas', N'DiasVencimiento') IS NOT NULL ALTER TABLE [dbo].[Ventas] DROP COLUMN [DiasVencimiento];
IF COL_LENGTH(N'dbo.Ventas', N'SerieFolio') IS NOT NULL ALTER TABLE [dbo].[Ventas] DROP COLUMN [SerieFolio];
IF COL_LENGTH(N'dbo.Conta_PrePolizas', N'AnioMes') IS NOT NULL ALTER TABLE [dbo].[Conta_PrePolizas] DROP COLUMN [AnioMes];
IF COL_LENGTH(N'dbo.ProductosServicios', N'CodigoPS') IS NOT NULL ALTER TABLE [dbo].[ProductosServicios] DROP COLUMN [CodigoPS];
USE [master];
ALTER DATABASE [SIG_PlataformaDesarolladores] COLLATE Modern_Spanish_CS_AS;
USE [SIG_PlataformaDesarolladores];
/* Reconstruir dependencias. */
IF OBJECT_ID(N'dbo.CK_Tra_DocumentosSolicitud_Tamano', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_DocumentosSolicitud] WITH CHECK ADD CONSTRAINT [CK_Tra_DocumentosSolicitud_Tamano] CHECK ([TamanoBytes] IS NULL OR [TamanoBytes]>=(0)); ALTER TABLE [dbo].[Tra_DocumentosSolicitud] CHECK CONSTRAINT [CK_Tra_DocumentosSolicitud_Tamano]; END;
IF OBJECT_ID(N'dbo.CK_Sis_NotificacionesEnvios_Canal', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_NotificacionesEnvios] WITH CHECK ADD CONSTRAINT [CK_Sis_NotificacionesEnvios_Canal] CHECK ([CanalEnvio]='Campana' OR [CanalEnvio]='Push' OR [CanalEnvio]='Correo' OR [CanalEnvio]='SignalR' OR [CanalEnvio]='WhatsApp' OR [CanalEnvio]='Local'); ALTER TABLE [dbo].[Sis_NotificacionesEnvios] CHECK CONSTRAINT [CK_Sis_NotificacionesEnvios_Canal]; END;
IF OBJECT_ID(N'dbo.CK_Sis_NotificacionesEnvios_Estado', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_NotificacionesEnvios] WITH CHECK ADD CONSTRAINT [CK_Sis_NotificacionesEnvios_Estado] CHECK ([EstadoEnvio]='Cancelado' OR [EstadoEnvio]='Fallido' OR [EstadoEnvio]='Enviado' OR [EstadoEnvio]='Pendiente'); ALTER TABLE [dbo].[Sis_NotificacionesEnvios] CHECK CONSTRAINT [CK_Sis_NotificacionesEnvios_Estado]; END;
IF OBJECT_ID(N'dbo.CK_Tra_RespuestasSolicitud_Valor', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_RespuestasSolicitud] WITH CHECK ADD CONSTRAINT [CK_Tra_RespuestasSolicitud_Valor] CHECK ([CveOpcionPregunta] IS NOT NULL OR [Valor] IS NOT NULL); ALTER TABLE [dbo].[Tra_RespuestasSolicitud] CHECK CONSTRAINT [CK_Tra_RespuestasSolicitud_Valor]; END;
IF OBJECT_ID(N'dbo.CK_Sis_UsuariosClientes_Orden', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_UsuariosClientes] WITH CHECK ADD CONSTRAINT [CK_Sis_UsuariosClientes_Orden] CHECK ([Orden]>(0)); ALTER TABLE [dbo].[Sis_UsuariosClientes] CHECK CONSTRAINT [CK_Sis_UsuariosClientes_Orden]; END;
IF OBJECT_ID(N'dbo.CK_Tra_CostosTramite_Importe', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_CostosTramite] WITH CHECK ADD CONSTRAINT [CK_Tra_CostosTramite_Importe] CHECK ([Importe]>=(0)); ALTER TABLE [dbo].[Tra_CostosTramite] CHECK CONSTRAINT [CK_Tra_CostosTramite_Importe]; END;
IF OBJECT_ID(N'dbo.CK_Tra_CostosTramite_Vigencia', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_CostosTramite] WITH CHECK ADD CONSTRAINT [CK_Tra_CostosTramite_Vigencia] CHECK ([FechaFinVigencia] IS NULL OR [FechaInicioVigencia] IS NULL OR [FechaFinVigencia]>=[FechaInicioVigencia]); ALTER TABLE [dbo].[Tra_CostosTramite] CHECK CONSTRAINT [CK_Tra_CostosTramite_Vigencia]; END;
IF OBJECT_ID(N'dbo.CK_Bit_Bitacora_Autorizacion', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Bit_Bitacora] WITH CHECK ADD CONSTRAINT [CK_Bit_Bitacora_Autorizacion] CHECK ([CveUsuarioAutoriza] IS NOT NULL OR [FechaAutorizacion] IS NULL); ALTER TABLE [dbo].[Bit_Bitacora] CHECK CONSTRAINT [CK_Bit_Bitacora_Autorizacion]; END;
IF OBJECT_ID(N'dbo.CK_VentasDetalle_FondoInicial', N'C') IS NULL BEGIN ALTER TABLE [dbo].[VentasDetalle] WITH CHECK ADD CONSTRAINT [CK_VentasDetalle_FondoInicial] CHECK ([EsFondoInicial]=(0) OR [CveSolicitud] IS NULL AND [CveCostoTramite] IS NULL); ALTER TABLE [dbo].[VentasDetalle] CHECK CONSTRAINT [CK_VentasDetalle_FondoInicial]; END;
IF OBJECT_ID(N'dbo.CK_VentasDetalle_Importes', N'C') IS NULL BEGIN ALTER TABLE [dbo].[VentasDetalle] WITH CHECK ADD CONSTRAINT [CK_VentasDetalle_Importes] CHECK ([Cantidad]>(0) AND [PrecioUnitario]>=(0) AND [Descuento]>=(0) AND [IVA]>=(0) AND [Importe]>=(0)); ALTER TABLE [dbo].[VentasDetalle] CHECK CONSTRAINT [CK_VentasDetalle_Importes]; END;
IF OBJECT_ID(N'dbo.CK_Vta_Pagos_Importe', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Vta_Pagos] WITH CHECK ADD CONSTRAINT [CK_Vta_Pagos_Importe] CHECK ([Importe]>(0)); ALTER TABLE [dbo].[Vta_Pagos] CHECK CONSTRAINT [CK_Vta_Pagos_Importe]; END;
IF OBJECT_ID(N'dbo.CK_Vta_Pagos_SaldoFavor', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Vta_Pagos] WITH CHECK ADD CONSTRAINT [CK_Vta_Pagos_SaldoFavor] CHECK ([EsSaldoFavor]=(0) OR [CveSolicitud] IS NULL); ALTER TABLE [dbo].[Vta_Pagos] CHECK CONSTRAINT [CK_Vta_Pagos_SaldoFavor]; END;
IF OBJECT_ID(N'dbo.CK_Bit_BitacoraRelaciones_ValorRelacion', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Bit_BitacoraRelaciones] WITH CHECK ADD CONSTRAINT [CK_Bit_BitacoraRelaciones_ValorRelacion] CHECK (NOT ([ValorRelacionNumero] IS NOT NULL AND [ValorRelacionTexto] IS NOT NULL)); ALTER TABLE [dbo].[Bit_BitacoraRelaciones] CHECK CONSTRAINT [CK_Bit_BitacoraRelaciones_ValorRelacion]; END;
IF OBJECT_ID(N'dbo.CK_Vta_AplicacionesSaldoFavor_Importe', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Vta_AplicacionesSaldoFavor] WITH CHECK ADD CONSTRAINT [CK_Vta_AplicacionesSaldoFavor_Importe] CHECK ([Importe]>(0)); ALTER TABLE [dbo].[Vta_AplicacionesSaldoFavor] CHECK CONSTRAINT [CK_Vta_AplicacionesSaldoFavor_Importe]; END;
IF OBJECT_ID(N'dbo.CHK_VentasMail', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CHK_VentasMail] CHECK ([EnvioMail]=(3) OR [EnvioMail]=(2) OR [EnvioMail]=(1) OR [EnvioMail]=(0)); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CHK_VentasMail]; END;
IF OBJECT_ID(N'dbo.CK_Ventas', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas] CHECK ([TipoDocto]='Egs' OR [TipoDocto]='Dev' OR [TipoDocto]='Ing' OR [TipoDocto]='Cot' OR [TipoDocto]='Rem' OR [TipoDocto]='Ped' OR [TipoDocto]='DPe' OR [TipoDocto]='Com' OR [TipoDocto]='OP' OR [TipoDocto]='Nom' OR [TipoDocto]='Ant' OR [TipoDocto]='PeC' OR [TipoDocto]='Pd2' OR [TipoDocto]='PA' OR [TipoDocto]='RNC' OR [TipoDocto]='Rmm'); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_1', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_1] CHECK ([CveCliente]>(0)); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_1]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_Dev_CveVentaPadre', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_Dev_CveVentaPadre] CHECK ([TipoDocto]='Dev' AND [CveVentaPadre]>(0) OR [TipoDocto]<>'Dev'); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_Dev_CveVentaPadre]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_FechaEjecucion_MinMax', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_FechaEjecucion_MinMax] CHECK ([FechaEjecucion]>'1900-01-01' AND [FechaEjecucion]<'2900-12-31'); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_FechaEjecucion_MinMax]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_Moneda_TipoCambio', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_Moneda_TipoCambio] CHECK ([CveMoneda]>=(2) AND [TipoCambio]>=(10) OR [CveMoneda]=(1) AND [TipoCambio]=(1)); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_Moneda_TipoCambio]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_TMp_AlmacenInactivo', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_TMp_AlmacenInactivo] CHECK ([CveAlmacenTraspasoDestino]<>(172) AND [CveVenta]>(1012251) OR [CveVenta]<=(1012251)); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_TMp_AlmacenInactivo]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_Total', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_Total] CHECK (datepart(year,[Fecha])>=(2018) AND abs(round([Total],(2))-round(((((((isnull([SubTotal],(0))+isnull([IVA],(0)))+isnull([IEPS],(0)))-isnull([Amortizacion],(0)))-isnull([RetIVA],(0)))-isnull([RetISR],(0)))-isnull([Descuento],(0)))-isnull([ImpuestoLocal],(0)),(2)))<(200.02) OR datepart(year,[Fecha])<(2018)); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_Total]; END;
IF OBJECT_ID(N'dbo.CK_Conta_Cuentas_Padre', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Conta_Cuentas] WITH CHECK ADD CONSTRAINT [CK_Conta_Cuentas_Padre] CHECK ([CveCuentaPadre]<>[CveCuenta]); ALTER TABLE [dbo].[Conta_Cuentas] CHECK CONSTRAINT [CK_Conta_Cuentas_Padre]; END;
IF OBJECT_ID(N'dbo.CK_Conta_Cuentas_Padre_Requerido', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Conta_Cuentas] WITH CHECK ADD CONSTRAINT [CK_Conta_Cuentas_Padre_Requerido] CHECK ([CveCuentaPadre] IS NOT NULL OR ([Codigo]='_ORDEN' OR [Codigo]='_ESTADISTICAS' OR [Codigo]='_GLOBAL')); ALTER TABLE [dbo].[Conta_Cuentas] CHECK CONSTRAINT [CK_Conta_Cuentas_Padre_Requerido]; END;
IF OBJECT_ID(N'dbo.CK_Fraccionamientos_Hectareas', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Fraccionamientos] WITH CHECK ADD CONSTRAINT [CK_Fraccionamientos_Hectareas] CHECK ([Hectareas] IS NULL OR [Hectareas]>=(0)); ALTER TABLE [dbo].[Fraccionamientos] CHECK CONSTRAINT [CK_Fraccionamientos_Hectareas]; END;
IF OBJECT_ID(N'dbo.CK_Clientes_RFC_Requerido', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [CK_Clientes_RFC_Requerido] CHECK ([RFC]<>''); ALTER TABLE [dbo].[Clientes] CHECK CONSTRAINT [CK_Clientes_RFC_Requerido]; END;
IF OBJECT_ID(N'dbo.CK_FraccionamientosEtapas_Hectareas', N'C') IS NULL BEGIN ALTER TABLE [dbo].[FraccionamientosEtapas] WITH CHECK ADD CONSTRAINT [CK_FraccionamientosEtapas_Hectareas] CHECK ([Hectareas] IS NULL OR [Hectareas]>=(0)); ALTER TABLE [dbo].[FraccionamientosEtapas] CHECK CONSTRAINT [CK_FraccionamientosEtapas_Hectareas]; END;
IF OBJECT_ID(N'dbo.CK_FraccionamientosLotes_MetrosCuadrados', N'C') IS NULL BEGIN ALTER TABLE [dbo].[FraccionamientosLotes] WITH CHECK ADD CONSTRAINT [CK_FraccionamientosLotes_MetrosCuadrados] CHECK ([MetrosCuadrados] IS NULL OR [MetrosCuadrados]>=(0)); ALTER TABLE [dbo].[FraccionamientosLotes] CHECK CONSTRAINT [CK_FraccionamientosLotes_MetrosCuadrados]; END;
IF OBJECT_ID(N'dbo.CK_Tra_TiposDocumento_Tamano', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_TiposDocumento] WITH CHECK ADD CONSTRAINT [CK_Tra_TiposDocumento_Tamano] CHECK ([TamanoMaximoMb] IS NULL OR [TamanoMaximoMb]>(0)); ALTER TABLE [dbo].[Tra_TiposDocumento] CHECK CONSTRAINT [CK_Tra_TiposDocumento_Tamano]; END;
IF OBJECT_ID(N'dbo.CK_Conta_PrePolizas_Concepto', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Conta_PrePolizas] WITH CHECK ADD CONSTRAINT [CK_Conta_PrePolizas_Concepto] CHECK (rtrim([Concepto])<>''); ALTER TABLE [dbo].[Conta_PrePolizas] CHECK CONSTRAINT [CK_Conta_PrePolizas_Concepto]; END;
IF OBJECT_ID(N'dbo.CK_Conta_PrePolizas_Fecha_2000_2050', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Conta_PrePolizas] WITH CHECK ADD CONSTRAINT [CK_Conta_PrePolizas_Fecha_2000_2050] CHECK ([Fecha]>='2000-01-01' AND [Fecha]<='2050/12/31'); ALTER TABLE [dbo].[Conta_PrePolizas] CHECK CONSTRAINT [CK_Conta_PrePolizas_Fecha_2000_2050]; END;
IF OBJECT_ID(N'dbo.CK_Conta_PrePolizas_FolioPoliza', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Conta_PrePolizas] WITH CHECK ADD CONSTRAINT [CK_Conta_PrePolizas_FolioPoliza] CHECK ([IdPoliza]>(0) AND isnull([FolioPoliza],(0))>(0) OR ([IdPoliza] IS NULL OR [IdPoliza]=(0))); ALTER TABLE [dbo].[Conta_PrePolizas] CHECK CONSTRAINT [CK_Conta_PrePolizas_FolioPoliza]; END;
IF OBJECT_ID(N'dbo.CK_Sis_PoliticasLimpieza_DiasRetencion', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_PoliticasLimpieza] WITH CHECK ADD CONSTRAINT [CK_Sis_PoliticasLimpieza_DiasRetencion] CHECK ([DiasRetencion]>=(30) AND [DiasRetencion]<=(3650)); ALTER TABLE [dbo].[Sis_PoliticasLimpieza] CHECK CONSTRAINT [CK_Sis_PoliticasLimpieza_DiasRetencion]; END;
IF OBJECT_ID(N'dbo.CK_Sis_PoliticasLimpieza_TamanoLote', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_PoliticasLimpieza] WITH CHECK ADD CONSTRAINT [CK_Sis_PoliticasLimpieza_TamanoLote] CHECK ([TamanoLote]>=(1) AND [TamanoLote]<=(10000)); ALTER TABLE [dbo].[Sis_PoliticasLimpieza] CHECK CONSTRAINT [CK_Sis_PoliticasLimpieza_TamanoLote]; END;
IF OBJECT_ID(N'dbo.CK_Sis_UsuariosAutorizaciones_Estado', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_UsuariosAutorizaciones] WITH CHECK ADD CONSTRAINT [CK_Sis_UsuariosAutorizaciones_Estado] CHECK ([EstadoAutorizacion]='Cancelada' OR [EstadoAutorizacion]='Rechazada' OR [EstadoAutorizacion]='Aprobada' OR [EstadoAutorizacion]='Pendiente'); ALTER TABLE [dbo].[Sis_UsuariosAutorizaciones] CHECK CONSTRAINT [CK_Sis_UsuariosAutorizaciones_Estado]; END;
IF OBJECT_ID(N'dbo.CK_Tra_SolicitudesDependencias_Diferentes', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_SolicitudesDependencias] WITH CHECK ADD CONSTRAINT [CK_Tra_SolicitudesDependencias_Diferentes] CHECK ([CveSolicitud]<>[CveSolicitudRequerida]); ALTER TABLE [dbo].[Tra_SolicitudesDependencias] CHECK CONSTRAINT [CK_Tra_SolicitudesDependencias_Diferentes]; END;
IF OBJECT_ID(N'dbo.CK_AsientoContableCompras', N'C') IS NULL BEGIN ALTER TABLE [dbo].[ProductosServicios] WITH CHECK ADD CONSTRAINT [CK_AsientoContableCompras] CHECK ([AsientoContableCompras]=(3) OR [AsientoContableCompras]=(2) OR [AsientoContableCompras]=(1)); ALTER TABLE [dbo].[ProductosServicios] CHECK CONSTRAINT [CK_AsientoContableCompras]; END;
IF OBJECT_ID(N'dbo.CK_AsientoContableVentas', N'C') IS NULL BEGIN ALTER TABLE [dbo].[ProductosServicios] WITH CHECK ADD CONSTRAINT [CK_AsientoContableVentas] CHECK ([AsientoContableVentas]=(2) OR [AsientoContableVentas]=(1)); ALTER TABLE [dbo].[ProductosServicios] CHECK CONSTRAINT [CK_AsientoContableVentas]; END;
IF OBJECT_ID(N'dbo.CK_ProductosServicios_IVA', N'C') IS NULL BEGIN ALTER TABLE [dbo].[ProductosServicios] WITH CHECK ADD CONSTRAINT [CK_ProductosServicios_IVA] CHECK ([IVA]=(-1) OR [IVA]=(0) OR [IVA] IS NULL); ALTER TABLE [dbo].[ProductosServicios] CHECK CONSTRAINT [CK_ProductosServicios_IVA]; END;
IF OBJECT_ID(N'dbo.CK_Sis_Notificaciones_Estado', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_Notificaciones] WITH CHECK ADD CONSTRAINT [CK_Sis_Notificaciones_Estado] CHECK ([EstadoNotificacion]='Cancelada' OR [EstadoNotificacion]='Fallida' OR [EstadoNotificacion]='Enviada' OR [EstadoNotificacion]='Pendiente'); ALTER TABLE [dbo].[Sis_Notificaciones] CHECK CONSTRAINT [CK_Sis_Notificaciones_Estado]; END;
IF OBJECT_ID(N'dbo.CK_Sis_Notificaciones_Tipo', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_Notificaciones] WITH CHECK ADD CONSTRAINT [CK_Sis_Notificaciones_Tipo] CHECK ([TipoNotificacion]='Campana' OR [TipoNotificacion]='Push' OR [TipoNotificacion]='Correo' OR [TipoNotificacion]='SignalR' OR [TipoNotificacion]='WhatsApp' OR [TipoNotificacion]='Local'); ALTER TABLE [dbo].[Sis_Notificaciones] CHECK CONSTRAINT [CK_Sis_Notificaciones_Tipo]; END;
IF COL_LENGTH(N'dbo.Banc_CreditosDetalle', N'IVA') IS NULL ALTER TABLE [dbo].[Banc_CreditosDetalle] ADD [IVA] AS (([IVACapital]+[IVAIntereses])+[IVASeguro]);
IF COL_LENGTH(N'dbo.Banc_CreditosDetalle', N'Total') IS NULL ALTER TABLE [dbo].[Banc_CreditosDetalle] ADD [Total] AS ((((([Capital]+[Intereses])+[Seguro])+[IVACapital])+[IVAIntereses])+[IVASeguro]);
IF COL_LENGTH(N'dbo.Ventas', N'DiasVencimiento') IS NULL ALTER TABLE [dbo].[Ventas] ADD [DiasVencimiento] AS (datediff(day,[FechaVencimiento2],getdate()));
IF COL_LENGTH(N'dbo.Ventas', N'SerieFolio') IS NULL ALTER TABLE [dbo].[Ventas] ADD [SerieFolio] AS ((concat(case when [Serie]<>'' then [Serie]+'-' else '' end,[Folio])) collate Modern_Spanish_CS_AS);
IF COL_LENGTH(N'dbo.Conta_PrePolizas', N'AnioMes') IS NULL ALTER TABLE [dbo].[Conta_PrePolizas] ADD [AnioMes] AS ((CONVERT([varchar](6),[Fecha],(112))) collate Modern_Spanish_CS_AS) PERSISTED;
IF COL_LENGTH(N'dbo.ProductosServicios', N'CodigoPS') IS NULL ALTER TABLE [dbo].[ProductosServicios] ADD [CodigoPS] AS ((case when len([Codigo])>(0) then concat(([Codigo]) collate Modern_Spanish_CI_AS,' - ',([PS]) collate Modern_Spanish_CI_AS) else ([PS]) collate Modern_Spanish_CI_AS end) collate Modern_Spanish_CI_AS);
IF NOT EXISTS(SELECT 1 FROM sys.indexes WHERE object_id=OBJECT_ID(N'dbo.Sis_UsuariosClientes') AND name=N'UX_Sis_UsuariosClientes_Usuario_Orden') CREATE UNIQUE NONCLUSTERED INDEX [UX_Sis_UsuariosClientes_Usuario_Orden] ON [dbo].[Sis_UsuariosClientes] ([CveUsuario] ASC,[Orden] ASC) WHERE ([Activo]=(1)) WITH (PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON) ON [PRIMARY];
IF NOT EXISTS(SELECT 1 FROM sys.indexes WHERE object_id=OBJECT_ID(N'dbo.Sis_Usuarios') AND name=N'UQ_Sis_Usuarios_CorreoElectronico') CREATE UNIQUE NONCLUSTERED INDEX [UQ_Sis_Usuarios_CorreoElectronico] ON [dbo].[Sis_Usuarios] ([CorreoElectronico] ASC) WHERE ([CorreoElectronico] IS NOT NULL) WITH (PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON) ON [PRIMARY];
IF NOT EXISTS(SELECT 1 FROM sys.indexes WHERE object_id=OBJECT_ID(N'dbo.Tra_Preguntas') AND name=N'UX_Tra_Preguntas_Codigo') CREATE UNIQUE NONCLUSTERED INDEX [UX_Tra_Preguntas_Codigo] ON [dbo].[Tra_Preguntas] ([Codigo] ASC) WHERE ([Codigo] IS NOT NULL) WITH (PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON) ON [PRIMARY];
USE [master];
ALTER DATABASE [SIG_PlataformaDesarolladores] SET MULTI_USER;
END TRY
BEGIN CATCH
DECLARE @Mensaje nvarchar(2048) = ERROR_MESSAGE();
BEGIN TRY
USE [SIG_PlataformaDesarolladores];
/* Reconstruir dependencias. */
IF OBJECT_ID(N'dbo.CK_Tra_DocumentosSolicitud_Tamano', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_DocumentosSolicitud] WITH CHECK ADD CONSTRAINT [CK_Tra_DocumentosSolicitud_Tamano] CHECK ([TamanoBytes] IS NULL OR [TamanoBytes]>=(0)); ALTER TABLE [dbo].[Tra_DocumentosSolicitud] CHECK CONSTRAINT [CK_Tra_DocumentosSolicitud_Tamano]; END;
IF OBJECT_ID(N'dbo.CK_Sis_NotificacionesEnvios_Canal', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_NotificacionesEnvios] WITH CHECK ADD CONSTRAINT [CK_Sis_NotificacionesEnvios_Canal] CHECK ([CanalEnvio]='Campana' OR [CanalEnvio]='Push' OR [CanalEnvio]='Correo' OR [CanalEnvio]='SignalR' OR [CanalEnvio]='WhatsApp' OR [CanalEnvio]='Local'); ALTER TABLE [dbo].[Sis_NotificacionesEnvios] CHECK CONSTRAINT [CK_Sis_NotificacionesEnvios_Canal]; END;
IF OBJECT_ID(N'dbo.CK_Sis_NotificacionesEnvios_Estado', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_NotificacionesEnvios] WITH CHECK ADD CONSTRAINT [CK_Sis_NotificacionesEnvios_Estado] CHECK ([EstadoEnvio]='Cancelado' OR [EstadoEnvio]='Fallido' OR [EstadoEnvio]='Enviado' OR [EstadoEnvio]='Pendiente'); ALTER TABLE [dbo].[Sis_NotificacionesEnvios] CHECK CONSTRAINT [CK_Sis_NotificacionesEnvios_Estado]; END;
IF OBJECT_ID(N'dbo.CK_Tra_RespuestasSolicitud_Valor', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_RespuestasSolicitud] WITH CHECK ADD CONSTRAINT [CK_Tra_RespuestasSolicitud_Valor] CHECK ([CveOpcionPregunta] IS NOT NULL OR [Valor] IS NOT NULL); ALTER TABLE [dbo].[Tra_RespuestasSolicitud] CHECK CONSTRAINT [CK_Tra_RespuestasSolicitud_Valor]; END;
IF OBJECT_ID(N'dbo.CK_Sis_UsuariosClientes_Orden', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_UsuariosClientes] WITH CHECK ADD CONSTRAINT [CK_Sis_UsuariosClientes_Orden] CHECK ([Orden]>(0)); ALTER TABLE [dbo].[Sis_UsuariosClientes] CHECK CONSTRAINT [CK_Sis_UsuariosClientes_Orden]; END;
IF OBJECT_ID(N'dbo.CK_Tra_CostosTramite_Importe', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_CostosTramite] WITH CHECK ADD CONSTRAINT [CK_Tra_CostosTramite_Importe] CHECK ([Importe]>=(0)); ALTER TABLE [dbo].[Tra_CostosTramite] CHECK CONSTRAINT [CK_Tra_CostosTramite_Importe]; END;
IF OBJECT_ID(N'dbo.CK_Tra_CostosTramite_Vigencia', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_CostosTramite] WITH CHECK ADD CONSTRAINT [CK_Tra_CostosTramite_Vigencia] CHECK ([FechaFinVigencia] IS NULL OR [FechaInicioVigencia] IS NULL OR [FechaFinVigencia]>=[FechaInicioVigencia]); ALTER TABLE [dbo].[Tra_CostosTramite] CHECK CONSTRAINT [CK_Tra_CostosTramite_Vigencia]; END;
IF OBJECT_ID(N'dbo.CK_Bit_Bitacora_Autorizacion', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Bit_Bitacora] WITH CHECK ADD CONSTRAINT [CK_Bit_Bitacora_Autorizacion] CHECK ([CveUsuarioAutoriza] IS NOT NULL OR [FechaAutorizacion] IS NULL); ALTER TABLE [dbo].[Bit_Bitacora] CHECK CONSTRAINT [CK_Bit_Bitacora_Autorizacion]; END;
IF OBJECT_ID(N'dbo.CK_VentasDetalle_FondoInicial', N'C') IS NULL BEGIN ALTER TABLE [dbo].[VentasDetalle] WITH CHECK ADD CONSTRAINT [CK_VentasDetalle_FondoInicial] CHECK ([EsFondoInicial]=(0) OR [CveSolicitud] IS NULL AND [CveCostoTramite] IS NULL); ALTER TABLE [dbo].[VentasDetalle] CHECK CONSTRAINT [CK_VentasDetalle_FondoInicial]; END;
IF OBJECT_ID(N'dbo.CK_VentasDetalle_Importes', N'C') IS NULL BEGIN ALTER TABLE [dbo].[VentasDetalle] WITH CHECK ADD CONSTRAINT [CK_VentasDetalle_Importes] CHECK ([Cantidad]>(0) AND [PrecioUnitario]>=(0) AND [Descuento]>=(0) AND [IVA]>=(0) AND [Importe]>=(0)); ALTER TABLE [dbo].[VentasDetalle] CHECK CONSTRAINT [CK_VentasDetalle_Importes]; END;
IF OBJECT_ID(N'dbo.CK_Vta_Pagos_Importe', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Vta_Pagos] WITH CHECK ADD CONSTRAINT [CK_Vta_Pagos_Importe] CHECK ([Importe]>(0)); ALTER TABLE [dbo].[Vta_Pagos] CHECK CONSTRAINT [CK_Vta_Pagos_Importe]; END;
IF OBJECT_ID(N'dbo.CK_Vta_Pagos_SaldoFavor', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Vta_Pagos] WITH CHECK ADD CONSTRAINT [CK_Vta_Pagos_SaldoFavor] CHECK ([EsSaldoFavor]=(0) OR [CveSolicitud] IS NULL); ALTER TABLE [dbo].[Vta_Pagos] CHECK CONSTRAINT [CK_Vta_Pagos_SaldoFavor]; END;
IF OBJECT_ID(N'dbo.CK_Bit_BitacoraRelaciones_ValorRelacion', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Bit_BitacoraRelaciones] WITH CHECK ADD CONSTRAINT [CK_Bit_BitacoraRelaciones_ValorRelacion] CHECK (NOT ([ValorRelacionNumero] IS NOT NULL AND [ValorRelacionTexto] IS NOT NULL)); ALTER TABLE [dbo].[Bit_BitacoraRelaciones] CHECK CONSTRAINT [CK_Bit_BitacoraRelaciones_ValorRelacion]; END;
IF OBJECT_ID(N'dbo.CK_Vta_AplicacionesSaldoFavor_Importe', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Vta_AplicacionesSaldoFavor] WITH CHECK ADD CONSTRAINT [CK_Vta_AplicacionesSaldoFavor_Importe] CHECK ([Importe]>(0)); ALTER TABLE [dbo].[Vta_AplicacionesSaldoFavor] CHECK CONSTRAINT [CK_Vta_AplicacionesSaldoFavor_Importe]; END;
IF OBJECT_ID(N'dbo.CHK_VentasMail', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CHK_VentasMail] CHECK ([EnvioMail]=(3) OR [EnvioMail]=(2) OR [EnvioMail]=(1) OR [EnvioMail]=(0)); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CHK_VentasMail]; END;
IF OBJECT_ID(N'dbo.CK_Ventas', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas] CHECK ([TipoDocto]='Egs' OR [TipoDocto]='Dev' OR [TipoDocto]='Ing' OR [TipoDocto]='Cot' OR [TipoDocto]='Rem' OR [TipoDocto]='Ped' OR [TipoDocto]='DPe' OR [TipoDocto]='Com' OR [TipoDocto]='OP' OR [TipoDocto]='Nom' OR [TipoDocto]='Ant' OR [TipoDocto]='PeC' OR [TipoDocto]='Pd2' OR [TipoDocto]='PA' OR [TipoDocto]='RNC' OR [TipoDocto]='Rmm'); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_1', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_1] CHECK ([CveCliente]>(0)); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_1]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_Dev_CveVentaPadre', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_Dev_CveVentaPadre] CHECK ([TipoDocto]='Dev' AND [CveVentaPadre]>(0) OR [TipoDocto]<>'Dev'); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_Dev_CveVentaPadre]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_FechaEjecucion_MinMax', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_FechaEjecucion_MinMax] CHECK ([FechaEjecucion]>'1900-01-01' AND [FechaEjecucion]<'2900-12-31'); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_FechaEjecucion_MinMax]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_Moneda_TipoCambio', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_Moneda_TipoCambio] CHECK ([CveMoneda]>=(2) AND [TipoCambio]>=(10) OR [CveMoneda]=(1) AND [TipoCambio]=(1)); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_Moneda_TipoCambio]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_TMp_AlmacenInactivo', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_TMp_AlmacenInactivo] CHECK ([CveAlmacenTraspasoDestino]<>(172) AND [CveVenta]>(1012251) OR [CveVenta]<=(1012251)); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_TMp_AlmacenInactivo]; END;
IF OBJECT_ID(N'dbo.CK_Ventas_Total', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Ventas] WITH CHECK ADD CONSTRAINT [CK_Ventas_Total] CHECK (datepart(year,[Fecha])>=(2018) AND abs(round([Total],(2))-round(((((((isnull([SubTotal],(0))+isnull([IVA],(0)))+isnull([IEPS],(0)))-isnull([Amortizacion],(0)))-isnull([RetIVA],(0)))-isnull([RetISR],(0)))-isnull([Descuento],(0)))-isnull([ImpuestoLocal],(0)),(2)))<(200.02) OR datepart(year,[Fecha])<(2018)); ALTER TABLE [dbo].[Ventas] CHECK CONSTRAINT [CK_Ventas_Total]; END;
IF OBJECT_ID(N'dbo.CK_Conta_Cuentas_Padre', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Conta_Cuentas] WITH CHECK ADD CONSTRAINT [CK_Conta_Cuentas_Padre] CHECK ([CveCuentaPadre]<>[CveCuenta]); ALTER TABLE [dbo].[Conta_Cuentas] CHECK CONSTRAINT [CK_Conta_Cuentas_Padre]; END;
IF OBJECT_ID(N'dbo.CK_Conta_Cuentas_Padre_Requerido', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Conta_Cuentas] WITH CHECK ADD CONSTRAINT [CK_Conta_Cuentas_Padre_Requerido] CHECK ([CveCuentaPadre] IS NOT NULL OR ([Codigo]='_ORDEN' OR [Codigo]='_ESTADISTICAS' OR [Codigo]='_GLOBAL')); ALTER TABLE [dbo].[Conta_Cuentas] CHECK CONSTRAINT [CK_Conta_Cuentas_Padre_Requerido]; END;
IF OBJECT_ID(N'dbo.CK_Fraccionamientos_Hectareas', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Fraccionamientos] WITH CHECK ADD CONSTRAINT [CK_Fraccionamientos_Hectareas] CHECK ([Hectareas] IS NULL OR [Hectareas]>=(0)); ALTER TABLE [dbo].[Fraccionamientos] CHECK CONSTRAINT [CK_Fraccionamientos_Hectareas]; END;
IF OBJECT_ID(N'dbo.CK_Clientes_RFC_Requerido', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [CK_Clientes_RFC_Requerido] CHECK ([RFC]<>''); ALTER TABLE [dbo].[Clientes] CHECK CONSTRAINT [CK_Clientes_RFC_Requerido]; END;
IF OBJECT_ID(N'dbo.CK_FraccionamientosEtapas_Hectareas', N'C') IS NULL BEGIN ALTER TABLE [dbo].[FraccionamientosEtapas] WITH CHECK ADD CONSTRAINT [CK_FraccionamientosEtapas_Hectareas] CHECK ([Hectareas] IS NULL OR [Hectareas]>=(0)); ALTER TABLE [dbo].[FraccionamientosEtapas] CHECK CONSTRAINT [CK_FraccionamientosEtapas_Hectareas]; END;
IF OBJECT_ID(N'dbo.CK_FraccionamientosLotes_MetrosCuadrados', N'C') IS NULL BEGIN ALTER TABLE [dbo].[FraccionamientosLotes] WITH CHECK ADD CONSTRAINT [CK_FraccionamientosLotes_MetrosCuadrados] CHECK ([MetrosCuadrados] IS NULL OR [MetrosCuadrados]>=(0)); ALTER TABLE [dbo].[FraccionamientosLotes] CHECK CONSTRAINT [CK_FraccionamientosLotes_MetrosCuadrados]; END;
IF OBJECT_ID(N'dbo.CK_Tra_TiposDocumento_Tamano', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_TiposDocumento] WITH CHECK ADD CONSTRAINT [CK_Tra_TiposDocumento_Tamano] CHECK ([TamanoMaximoMb] IS NULL OR [TamanoMaximoMb]>(0)); ALTER TABLE [dbo].[Tra_TiposDocumento] CHECK CONSTRAINT [CK_Tra_TiposDocumento_Tamano]; END;
IF OBJECT_ID(N'dbo.CK_Conta_PrePolizas_Concepto', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Conta_PrePolizas] WITH CHECK ADD CONSTRAINT [CK_Conta_PrePolizas_Concepto] CHECK (rtrim([Concepto])<>''); ALTER TABLE [dbo].[Conta_PrePolizas] CHECK CONSTRAINT [CK_Conta_PrePolizas_Concepto]; END;
IF OBJECT_ID(N'dbo.CK_Conta_PrePolizas_Fecha_2000_2050', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Conta_PrePolizas] WITH CHECK ADD CONSTRAINT [CK_Conta_PrePolizas_Fecha_2000_2050] CHECK ([Fecha]>='2000-01-01' AND [Fecha]<='2050/12/31'); ALTER TABLE [dbo].[Conta_PrePolizas] CHECK CONSTRAINT [CK_Conta_PrePolizas_Fecha_2000_2050]; END;
IF OBJECT_ID(N'dbo.CK_Conta_PrePolizas_FolioPoliza', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Conta_PrePolizas] WITH CHECK ADD CONSTRAINT [CK_Conta_PrePolizas_FolioPoliza] CHECK ([IdPoliza]>(0) AND isnull([FolioPoliza],(0))>(0) OR ([IdPoliza] IS NULL OR [IdPoliza]=(0))); ALTER TABLE [dbo].[Conta_PrePolizas] CHECK CONSTRAINT [CK_Conta_PrePolizas_FolioPoliza]; END;
IF OBJECT_ID(N'dbo.CK_Sis_PoliticasLimpieza_DiasRetencion', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_PoliticasLimpieza] WITH CHECK ADD CONSTRAINT [CK_Sis_PoliticasLimpieza_DiasRetencion] CHECK ([DiasRetencion]>=(30) AND [DiasRetencion]<=(3650)); ALTER TABLE [dbo].[Sis_PoliticasLimpieza] CHECK CONSTRAINT [CK_Sis_PoliticasLimpieza_DiasRetencion]; END;
IF OBJECT_ID(N'dbo.CK_Sis_PoliticasLimpieza_TamanoLote', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_PoliticasLimpieza] WITH CHECK ADD CONSTRAINT [CK_Sis_PoliticasLimpieza_TamanoLote] CHECK ([TamanoLote]>=(1) AND [TamanoLote]<=(10000)); ALTER TABLE [dbo].[Sis_PoliticasLimpieza] CHECK CONSTRAINT [CK_Sis_PoliticasLimpieza_TamanoLote]; END;
IF OBJECT_ID(N'dbo.CK_Sis_UsuariosAutorizaciones_Estado', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_UsuariosAutorizaciones] WITH CHECK ADD CONSTRAINT [CK_Sis_UsuariosAutorizaciones_Estado] CHECK ([EstadoAutorizacion]='Cancelada' OR [EstadoAutorizacion]='Rechazada' OR [EstadoAutorizacion]='Aprobada' OR [EstadoAutorizacion]='Pendiente'); ALTER TABLE [dbo].[Sis_UsuariosAutorizaciones] CHECK CONSTRAINT [CK_Sis_UsuariosAutorizaciones_Estado]; END;
IF OBJECT_ID(N'dbo.CK_Tra_SolicitudesDependencias_Diferentes', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Tra_SolicitudesDependencias] WITH CHECK ADD CONSTRAINT [CK_Tra_SolicitudesDependencias_Diferentes] CHECK ([CveSolicitud]<>[CveSolicitudRequerida]); ALTER TABLE [dbo].[Tra_SolicitudesDependencias] CHECK CONSTRAINT [CK_Tra_SolicitudesDependencias_Diferentes]; END;
IF OBJECT_ID(N'dbo.CK_AsientoContableCompras', N'C') IS NULL BEGIN ALTER TABLE [dbo].[ProductosServicios] WITH CHECK ADD CONSTRAINT [CK_AsientoContableCompras] CHECK ([AsientoContableCompras]=(3) OR [AsientoContableCompras]=(2) OR [AsientoContableCompras]=(1)); ALTER TABLE [dbo].[ProductosServicios] CHECK CONSTRAINT [CK_AsientoContableCompras]; END;
IF OBJECT_ID(N'dbo.CK_AsientoContableVentas', N'C') IS NULL BEGIN ALTER TABLE [dbo].[ProductosServicios] WITH CHECK ADD CONSTRAINT [CK_AsientoContableVentas] CHECK ([AsientoContableVentas]=(2) OR [AsientoContableVentas]=(1)); ALTER TABLE [dbo].[ProductosServicios] CHECK CONSTRAINT [CK_AsientoContableVentas]; END;
IF OBJECT_ID(N'dbo.CK_ProductosServicios_IVA', N'C') IS NULL BEGIN ALTER TABLE [dbo].[ProductosServicios] WITH CHECK ADD CONSTRAINT [CK_ProductosServicios_IVA] CHECK ([IVA]=(-1) OR [IVA]=(0) OR [IVA] IS NULL); ALTER TABLE [dbo].[ProductosServicios] CHECK CONSTRAINT [CK_ProductosServicios_IVA]; END;
IF OBJECT_ID(N'dbo.CK_Sis_Notificaciones_Estado', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_Notificaciones] WITH CHECK ADD CONSTRAINT [CK_Sis_Notificaciones_Estado] CHECK ([EstadoNotificacion]='Cancelada' OR [EstadoNotificacion]='Fallida' OR [EstadoNotificacion]='Enviada' OR [EstadoNotificacion]='Pendiente'); ALTER TABLE [dbo].[Sis_Notificaciones] CHECK CONSTRAINT [CK_Sis_Notificaciones_Estado]; END;
IF OBJECT_ID(N'dbo.CK_Sis_Notificaciones_Tipo', N'C') IS NULL BEGIN ALTER TABLE [dbo].[Sis_Notificaciones] WITH CHECK ADD CONSTRAINT [CK_Sis_Notificaciones_Tipo] CHECK ([TipoNotificacion]='Campana' OR [TipoNotificacion]='Push' OR [TipoNotificacion]='Correo' OR [TipoNotificacion]='SignalR' OR [TipoNotificacion]='WhatsApp' OR [TipoNotificacion]='Local'); ALTER TABLE [dbo].[Sis_Notificaciones] CHECK CONSTRAINT [CK_Sis_Notificaciones_Tipo]; END;
IF COL_LENGTH(N'dbo.Banc_CreditosDetalle', N'IVA') IS NULL ALTER TABLE [dbo].[Banc_CreditosDetalle] ADD [IVA] AS (([IVACapital]+[IVAIntereses])+[IVASeguro]);
IF COL_LENGTH(N'dbo.Banc_CreditosDetalle', N'Total') IS NULL ALTER TABLE [dbo].[Banc_CreditosDetalle] ADD [Total] AS ((((([Capital]+[Intereses])+[Seguro])+[IVACapital])+[IVAIntereses])+[IVASeguro]);
IF COL_LENGTH(N'dbo.Ventas', N'DiasVencimiento') IS NULL ALTER TABLE [dbo].[Ventas] ADD [DiasVencimiento] AS (datediff(day,[FechaVencimiento2],getdate()));
IF COL_LENGTH(N'dbo.Ventas', N'SerieFolio') IS NULL ALTER TABLE [dbo].[Ventas] ADD [SerieFolio] AS ((concat(case when [Serie]<>'' then [Serie]+'-' else '' end,[Folio])) collate Modern_Spanish_CS_AS);
IF COL_LENGTH(N'dbo.Conta_PrePolizas', N'AnioMes') IS NULL ALTER TABLE [dbo].[Conta_PrePolizas] ADD [AnioMes] AS ((CONVERT([varchar](6),[Fecha],(112))) collate Modern_Spanish_CS_AS) PERSISTED;
IF COL_LENGTH(N'dbo.ProductosServicios', N'CodigoPS') IS NULL ALTER TABLE [dbo].[ProductosServicios] ADD [CodigoPS] AS ((case when len([Codigo])>(0) then concat(([Codigo]) collate Modern_Spanish_CI_AS,' - ',([PS]) collate Modern_Spanish_CI_AS) else ([PS]) collate Modern_Spanish_CI_AS end) collate Modern_Spanish_CI_AS);
IF NOT EXISTS(SELECT 1 FROM sys.indexes WHERE object_id=OBJECT_ID(N'dbo.Sis_UsuariosClientes') AND name=N'UX_Sis_UsuariosClientes_Usuario_Orden') CREATE UNIQUE NONCLUSTERED INDEX [UX_Sis_UsuariosClientes_Usuario_Orden] ON [dbo].[Sis_UsuariosClientes] ([CveUsuario] ASC,[Orden] ASC) WHERE ([Activo]=(1)) WITH (PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON) ON [PRIMARY];
IF NOT EXISTS(SELECT 1 FROM sys.indexes WHERE object_id=OBJECT_ID(N'dbo.Sis_Usuarios') AND name=N'UQ_Sis_Usuarios_CorreoElectronico') CREATE UNIQUE NONCLUSTERED INDEX [UQ_Sis_Usuarios_CorreoElectronico] ON [dbo].[Sis_Usuarios] ([CorreoElectronico] ASC) WHERE ([CorreoElectronico] IS NOT NULL) WITH (PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON) ON [PRIMARY];
IF NOT EXISTS(SELECT 1 FROM sys.indexes WHERE object_id=OBJECT_ID(N'dbo.Tra_Preguntas') AND name=N'UX_Tra_Preguntas_Codigo') CREATE UNIQUE NONCLUSTERED INDEX [UX_Tra_Preguntas_Codigo] ON [dbo].[Tra_Preguntas] ([Codigo] ASC) WHERE ([Codigo] IS NOT NULL) WITH (PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON) ON [PRIMARY];
END TRY
BEGIN CATCH
SET @Mensaje = CONCAT(@Mensaje, N' Error al restaurar dependencias: ', ERROR_MESSAGE());
END CATCH;
USE [master];
ALTER DATABASE [SIG_PlataformaDesarolladores] SET MULTI_USER;
THROW 51001, @Mensaje, 1;
END CATCH;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,164 @@
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_RegistroClienteUsuarioValidate]
@NombreUsuario varchar(100),
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
SET @NombreUsuario = LTRIM(RTRIM(@NombreUsuario));
IF NULLIF(@NombreUsuario, '') IS NULL
BEGIN
SET @ErrorMostrar = 'Captura el nombre de usuario para verificarlo.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM [dbo].[Sis_Usuarios]
WHERE [NombreUsuario] = @NombreUsuario
)
BEGIN
SET @ErrorMostrar = 'El nombre de usuario ya se encuentra registrado. Elige uno diferente.';
SET @ErrorTipo = 2;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al validar el nombre de usuario; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Sis_RegistroClienteUsuarioValidate'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_RegistroClienteCorreoValidate]
@CorreoElectronico varchar(255),
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
SET @CorreoElectronico = LOWER(LTRIM(RTRIM(@CorreoElectronico)));
IF NULLIF(@CorreoElectronico, '') IS NULL
BEGIN
SET @ErrorMostrar = 'Captura el correo electrónico para verificarlo.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM [dbo].[Sis_Usuarios]
WHERE LOWER([CorreoElectronico]) = @CorreoElectronico
)
BEGIN
SET @ErrorMostrar = 'El correo electrónico ya se encuentra registrado. Contacta a Soporte Técnico antes de continuar.';
SET @ErrorTipo = 2;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al validar el correo; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Sis_RegistroClienteCorreoValidate'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_RegistroClienteRFCValidate]
@RFC varchar(15),
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
SET @RFC = UPPER(REPLACE(LTRIM(RTRIM(@RFC)), ' ', ''));
IF NULLIF(@RFC, '') IS NULL
BEGIN
SET @ErrorMostrar = 'Captura el RFC para verificarlo.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM [dbo].[Clientes]
WHERE UPPER(REPLACE(LTRIM(RTRIM([RFC])), ' ', '')) = @RFC
)
BEGIN
SET @ErrorMostrar = 'El RFC ya se encuentra registrado. Contacta a Soporte Técnico para solicitar acceso.';
SET @ErrorTipo = 2;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar = 'Ocurrió un error al validar el RFC; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Sis_RegistroClienteRFCValidate'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO

View File

@@ -0,0 +1,365 @@
SET NOCOUNT ON;
GO
/*
El resumen se genera a partir de la definición instalada para conservar
ajustes locales del procedimiento original. Solamente se elimina el bloque
que consulta campos y relaciones internas de cada movimiento.
*/
DECLARE @DefinicionResumen nvarchar(max) =
OBJECT_DEFINITION(
OBJECT_ID(N'dbo.PA_Bit_BitacoraListByRelations'));
IF @DefinicionResumen IS NULL
BEGIN
THROW 50000,
'No existe dbo.PA_Bit_BitacoraListByRelations.',
1;
END;
DECLARE @InicioProcedimiento int = CHARINDEX(
N'PROCEDURE',
UPPER(@DefinicionResumen));
DECLARE @InicioDetalle int = CHARINDEX(
N'CREATE TABLE #CamposPagina',
@DefinicionResumen);
DECLARE @FinDetalle int = CHARINDEX(
N'CREATE TABLE #RelacionesVisuales',
@DefinicionResumen);
IF @InicioProcedimiento = 0
OR @InicioDetalle = 0
OR @FinDetalle <= @InicioDetalle
BEGIN
THROW 50001,
'La definición instalada de la consulta de bitácora no tiene la estructura esperada.',
1;
END;
SET @DefinicionResumen = STUFF(
@DefinicionResumen,
@InicioDetalle,
@FinDetalle - @InicioDetalle,
N'');
SET @DefinicionResumen = STUFF(
@DefinicionResumen,
1,
@InicioProcedimiento - 1,
N'CREATE OR ALTER ');
SET @DefinicionResumen = REPLACE(
@DefinicionResumen,
N'dbo.PA_Bit_BitacoraListByRelations',
N'dbo.PA_Bit_BitacoraResumenListByRelations');
EXEC sys.sp_executesql @DefinicionResumen;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Bit_BitacoraDetalleGet
@CveBitacora bigint,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF @CveBitacora <= 0
BEGIN
SET @ErrorMostrar =
'La clave del movimiento de bitácora no es válida.';
SET @ErrorTipo = 2;
RETURN;
END;
DECLARE @EsAdministrador bit = 0;
DECLARE @EsDesarrollador bit = 0;
SELECT
@EsAdministrador = CASE
WHEN R.NombreRol IN
(
'SuperUsuario',
'Administrador'
) THEN 1
ELSE 0
END,
@EsDesarrollador = CASE
WHEN R.NombreRol = 'Empresa' THEN 1
ELSE 0
END
FROM dbo.Sis_Usuarios AS U
INNER JOIN dbo.Sis_Roles AS R
ON R.CveRol = U.CveRol
WHERE U.CveUsuario = @CveUsuarioEjecuta
AND U.Activo = 1
AND R.Activo = 1;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Bit_Bitacora AS B
WHERE B.CveBitacora = @CveBitacora
AND
(
@EsAdministrador = 1
OR
(
@EsDesarrollador = 1
AND EXISTS
(
SELECT 1
FROM dbo.Bit_BitacoraRelaciones AS BRCliente
INNER JOIN dbo.Bit_Tablas AS TCliente
ON TCliente.CveTabla =
BRCliente.CveTablaRelacionada
INNER JOIN dbo.Bit_Campos AS CCliente
ON CCliente.CveCampo =
BRCliente.CveCampoRelacion
AND CCliente.CveTabla = TCliente.CveTabla
INNER JOIN dbo.Sis_UsuariosClientes AS UC
ON UC.CveCliente =
BRCliente.ValorRelacionNumero
AND UC.CveUsuario = @CveUsuarioEjecuta
AND UC.Activo = 1
WHERE BRCliente.CveBitacora = B.CveBitacora
AND BRCliente.VisibleDesarrollador = 1
AND TCliente.NombreTablaSQL = 'Clientes'
AND CCliente.NombreCampoSQL = 'CveCliente'
)
)
)
)
BEGIN
SET @ErrorMostrar =
'No se encontró el movimiento de bitácora solicitado.';
SET @ErrorTipo = 2;
RETURN;
END;
SELECT
B.CveBitacora,
B.CveTabla,
T.NombreTablaSQL,
T.NombreMostrar AS NombreTabla,
B.CveTipoMovimiento,
M.Nombre AS TipoMovimiento,
B.CveDefinicionAccion,
A.NombreAccion,
A.DescripcionAccion,
B.CveUsuarioEjecuta,
COALESCE(
NULLIF(U.NombreUsuario, ''),
CONCAT('(', B.CveUsuarioEjecuta, ') Eliminado')
) AS NombreUsuarioEjecuta,
B.CveUsuarioAutoriza,
B.FechaAutorizacion,
B.LlaveRegistro,
B.DescripcionMovimiento,
B.FechaMovimiento,
B.DireccionIP,
B.NombreEquipo,
B.Modulo
FROM dbo.Bit_Bitacora AS B
INNER JOIN dbo.Bit_Tablas AS T
ON T.CveTabla = B.CveTabla
INNER JOIN dbo.Bit_TiposMovimiento AS M
ON M.CveTipoMovimiento = B.CveTipoMovimiento
LEFT JOIN dbo.Bit_DefinicionesAccion AS A
ON A.CveDefinicionAccion = B.CveDefinicionAccion
LEFT JOIN dbo.Sis_Usuarios AS U
ON U.CveUsuario = B.CveUsuarioEjecuta
WHERE B.CveBitacora = @CveBitacora;
CREATE TABLE #CamposDetalle
(
CveBitacoraCampo bigint NOT NULL PRIMARY KEY,
CveBitacora bigint NOT NULL,
CveCampo int NOT NULL,
NombreCampoSQL varchar(128)
COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreMostrar varchar(150)
COLLATE Modern_Spanish_CS_AS NOT NULL,
ValorAnterior nvarchar(max)
COLLATE Modern_Spanish_CS_AS NULL,
ValorNuevo nvarchar(max)
COLLATE Modern_Spanish_CS_AS NULL,
ValorAnteriorMostrar nvarchar(max)
COLLATE Modern_Spanish_CS_AS NULL,
ValorNuevoMostrar nvarchar(max)
COLLATE Modern_Spanish_CS_AS NULL
);
INSERT INTO #CamposDetalle
(
CveBitacoraCampo,
CveBitacora,
CveCampo,
NombreCampoSQL,
NombreMostrar,
ValorAnterior,
ValorNuevo,
ValorAnteriorMostrar,
ValorNuevoMostrar
)
SELECT
BC.CveBitacoraCampo,
BC.CveBitacora,
BC.CveCampo,
C.NombreCampoSQL,
C.NombreMostrar,
BC.ValorAnterior,
BC.ValorNuevo,
BC.ValorAnterior,
BC.ValorNuevo
FROM dbo.Bit_BitacoraCampos AS BC
INNER JOIN dbo.Bit_Campos AS C
ON C.CveCampo = BC.CveCampo
WHERE BC.CveBitacora = @CveBitacora
AND
(
@EsAdministrador = 1
OR C.MostrarEnBitacora = 1
);
DECLARE @CveCampoOrigenReferencia int;
DECLARE @NombreTablaReferencia varchar(128);
DECLARE @NombreCampoLlaveReferencia varchar(128);
DECLARE @NombreCampoMostrarReferencia varchar(128);
DECLARE @SqlCampoReferencia nvarchar(max);
DECLARE CursorCamposReferencia CURSOR LOCAL FAST_FORWARD FOR
SELECT DISTINCT
CO.CveCampo,
TR.NombreTablaSQL,
CL.NombreCampoSQL,
CM.NombreCampoSQL
FROM #CamposDetalle AS CD
INNER JOIN dbo.Bit_Campos AS CO
ON CO.CveCampo = CD.CveCampo
AND CO.Activo = 1
INNER JOIN dbo.Bit_Tablas AS TR
ON TR.CveTabla = CO.CveTablaReferencia
AND TR.Activo = 1
AND TR.NombreCampoLlaveSQL IS NOT NULL
INNER JOIN dbo.Bit_Campos AS CL
ON CL.CveTabla = TR.CveTabla
AND CL.NombreCampoSQL = TR.NombreCampoLlaveSQL
AND CL.Activo = 1
INNER JOIN dbo.Bit_Campos AS CM
ON CM.CveCampo = CO.CveCampoMostrarReferencia
AND CM.CveTabla = TR.CveTabla
AND CM.MostrarEnBitacora = 1
AND CM.Activo = 1
INNER JOIN sys.schemas AS SC
ON SC.name = 'dbo'
INNER JOIN sys.tables AS ST
ON ST.schema_id = SC.schema_id
AND ST.name COLLATE Modern_Spanish_CS_AS = TR.NombreTablaSQL
INNER JOIN sys.columns AS SCL
ON SCL.object_id = ST.object_id
AND SCL.name COLLATE Modern_Spanish_CS_AS =
CL.NombreCampoSQL
INNER JOIN sys.columns AS SCM
ON SCM.object_id = ST.object_id
AND SCM.name COLLATE Modern_Spanish_CS_AS =
CM.NombreCampoSQL;
OPEN CursorCamposReferencia;
FETCH NEXT FROM CursorCamposReferencia INTO
@CveCampoOrigenReferencia,
@NombreTablaReferencia,
@NombreCampoLlaveReferencia,
@NombreCampoMostrarReferencia;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SqlCampoReferencia = N'
UPDATE CD
SET
CD.ValorAnteriorMostrar = CASE
WHEN CD.ValorAnterior IS NULL THEN NULL
WHEN VA.' + QUOTENAME(@NombreCampoLlaveReferencia) + N' IS NULL
THEN CONCAT(N''('', CD.ValorAnterior, N'') Eliminada'')
WHEN NULLIF(CONVERT(nvarchar(max), VA.' + QUOTENAME(@NombreCampoMostrarReferencia) + N'), N'''') IS NULL
THEN CONCAT(N''('', CD.ValorAnterior, N'')'')
ELSE CONVERT(nvarchar(max), VA.' + QUOTENAME(@NombreCampoMostrarReferencia) + N')
END,
CD.ValorNuevoMostrar = CASE
WHEN CD.ValorNuevo IS NULL THEN NULL
WHEN VN.' + QUOTENAME(@NombreCampoLlaveReferencia) + N' IS NULL
THEN CONCAT(N''('', CD.ValorNuevo, N'') Eliminada'')
WHEN NULLIF(CONVERT(nvarchar(max), VN.' + QUOTENAME(@NombreCampoMostrarReferencia) + N'), N'''') IS NULL
THEN CONCAT(N''('', CD.ValorNuevo, N'')'')
ELSE CONVERT(nvarchar(max), VN.' + QUOTENAME(@NombreCampoMostrarReferencia) + N')
END
FROM #CamposDetalle AS CD
LEFT JOIN dbo.' + QUOTENAME(@NombreTablaReferencia) + N' AS VA
ON CONVERT(nvarchar(250), VA.' + QUOTENAME(@NombreCampoLlaveReferencia) + N')
COLLATE Modern_Spanish_CS_AS =
CD.ValorAnterior COLLATE Modern_Spanish_CS_AS
LEFT JOIN dbo.' + QUOTENAME(@NombreTablaReferencia) + N' AS VN
ON CONVERT(nvarchar(250), VN.' + QUOTENAME(@NombreCampoLlaveReferencia) + N')
COLLATE Modern_Spanish_CS_AS =
CD.ValorNuevo COLLATE Modern_Spanish_CS_AS
WHERE CD.CveCampo = @CveCampoOrigen;';
EXEC sys.sp_executesql
@SqlCampoReferencia,
N'@CveCampoOrigen int',
@CveCampoOrigen = @CveCampoOrigenReferencia;
FETCH NEXT FROM CursorCamposReferencia INTO
@CveCampoOrigenReferencia,
@NombreTablaReferencia,
@NombreCampoLlaveReferencia,
@NombreCampoMostrarReferencia;
END;
CLOSE CursorCamposReferencia;
DEALLOCATE CursorCamposReferencia;
SELECT
CveBitacoraCampo,
CveBitacora,
CveCampo,
NombreCampoSQL,
NombreMostrar,
ValorAnterior,
ValorNuevo,
ValorAnteriorMostrar,
ValorNuevoMostrar
FROM #CamposDetalle
ORDER BY CveBitacoraCampo;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar =
'Ocurrió un error al consultar el detalle de la bitácora; favor de contactar a Sistemas.';
SET @ErrorTipo = 1;
SET @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Bit_BitacoraDetalleGet'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO

View File

@@ -0,0 +1,185 @@
CREATE OR ALTER PROCEDURE dbo.PA_Vta_FraccionamientoPagoPendienteList
@CveFraccionamiento int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fraccionamientos
WHERE CveFraccionamiento = @CveFraccionamiento
)
BEGIN
SELECT
@ErrorMostrar = 'El fraccionamiento solicitado no existe.',
@ErrorTipo = 2;
RETURN;
END;
;WITH Conceptos AS
(
SELECT
S.CveSolicitud,
P.CveTramitePago,
COUNT_BIG(*) AS NumeroConceptos,
SUM(
ROUND(
CONVERT(decimal(18, 4), Costo.Importe),
2
) * D.Cantidad
) AS SubTotal,
SUM(
ROUND(
CONVERT(decimal(18, 4), Costo.Importe)
* D.Cantidad
* ISNULL(ImpuestoIVA.TasaOCuota, 0),
2
)
) AS IVA
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTipoTramite = S.CveTipoTramite
AND P.EsActivo = 1
INNER JOIN dbo.Tra_PagosDetalle AS D
ON D.CveTramitePago = P.CveTramitePago
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = D.CvePS
OUTER APPLY
(
SELECT TOP (1)
CT.CveCostoTramite,
CT.Importe
FROM dbo.Tra_CostosTramite AS CT
WHERE CT.CveTipoTramite = S.CveTipoTramite
AND CT.CvePS = D.CvePS
AND CT.EsActivo = 1
AND
(
CT.FechaInicioVigencia IS NULL
OR CT.FechaInicioVigencia <= CONVERT(date, GETDATE())
)
AND
(
CT.FechaFinVigencia IS NULL
OR CT.FechaFinVigencia >= CONVERT(date, GETDATE())
)
ORDER BY
ISNULL(
CT.FechaInicioVigencia,
CONVERT(date, '19000101')) DESC,
CT.CveCostoTramite DESC
) AS Costo
OUTER APPLY
(
SELECT TOP (1) CTI.TasaOCuota
FROM dbo.Tra_CostosTramiteImpuestos AS CTI
WHERE CTI.CveCostoTramite = Costo.CveCostoTramite
AND CTI.EsRetencion = 0
AND CTI.Impuesto = '002'
AND CTI.TipoFactor = 'Tasa'
) AS ImpuestoIVA
WHERE S.CveFraccionamiento = @CveFraccionamiento
GROUP BY
S.CveSolicitud,
P.CveTramitePago
)
SELECT
S.CveSolicitud,
P.CveTramitePago,
SP.CveVenta,
CONVERT(
bit,
CASE
WHEN SP.CveSolicitudPago IS NOT NULL
AND V.CveVenta IS NOT NULL THEN 1
ELSE 0
END
) AS VentaGenerada,
S.Folio AS FolioSolicitud,
E.Etapa,
TT.TipoTramite,
P.Nombre AS NombrePago,
CONVERT(int, C.NumeroConceptos) AS NumeroConceptos,
CONVERT(
decimal(18, 2),
CASE
WHEN V.CveVenta IS NULL THEN C.SubTotal
ELSE V.SubTotal
END
) AS SubTotal,
CONVERT(
decimal(18, 2),
CASE
WHEN V.CveVenta IS NULL THEN C.IVA
ELSE V.IVA
END
) AS IVA,
CONVERT(
decimal(18, 2),
CASE
WHEN V.CveVenta IS NULL THEN C.SubTotal + C.IVA
ELSE V.Total
END
) AS Total
FROM Conceptos AS C
INNER JOIN dbo.Tra_Solicitudes AS S
ON S.CveSolicitud = C.CveSolicitud
INNER JOIN dbo.FraccionamientosEtapas AS E
ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
INNER JOIN dbo.Tra_TiposTramite AS TT
ON TT.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = C.CveTramitePago
LEFT JOIN dbo.Tra_SolicitudesPagos AS SP
ON SP.CveSolicitud = S.CveSolicitud
AND SP.CveTramitePago = P.CveTramitePago
LEFT JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Vta_Pagos AS VP
WHERE VP.CveSolicitud = S.CveSolicitud
AND VP.CveTramitePago = P.CveTramitePago
AND VP.CveVenta = SP.CveVenta
AND VP.EsActivo = 1
)
ORDER BY
E.Orden,
S.CveSolicitud,
P.Orden,
P.CveTramitePago;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar los pagos pendientes; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_FraccionamientoPagoPendienteList'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO

View File

@@ -0,0 +1,594 @@
CREATE OR ALTER PROCEDURE dbo.PA_Sis_UsuarioGetByName
@NombreUsuario varchar(100),
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SELECT TOP (1)
U.CveUsuario,
U.NombreUsuario,
U.HashContrasena,
U.CorreoElectronico,
U.CveRol,
R.NombreRol,
U.Activo,
U.DebeCambiarContrasena,
U.IntentosFallidosInicioSesion,
U.BloqueadoHasta,
U.FechaUltimoInicioSesion,
U.FechaUltimaConexion,
U.CorreoVerificado,
ISNULL(ClientePrincipal.CveCliente, 0) AS CveCliente
FROM dbo.Sis_Usuarios AS U
INNER JOIN dbo.Sis_Roles AS R
ON R.CveRol = U.CveRol
OUTER APPLY
(
SELECT TOP (1) UC.CveCliente
FROM dbo.Sis_UsuariosClientes AS UC
INNER JOIN dbo.Clientes AS C
ON C.CveCliente = UC.CveCliente
AND C.Estatus = 1
WHERE UC.CveUsuario = U.CveUsuario
AND UC.Activo = 1
ORDER BY
UC.EsPrincipal DESC,
UC.Orden,
UC.CveUsuarioCliente
) AS ClientePrincipal
WHERE U.NombreUsuario = @NombreUsuario;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar el usuario; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Sis_UsuarioGetByName'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Sis_PerfilGet
@CveUsuario int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.Sis_Usuarios
WHERE CveUsuario = @CveUsuario
AND Activo = 1
)
BEGIN
SELECT
@ErrorMostrar = 'No se encontró el usuario activo de la sesión.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
U.CveUsuario,
U.NombreUsuario,
U.CorreoElectronico,
U.CveRol,
R.NombreRol,
ISNULL(ClientePrincipal.CveCliente, 0) AS CveCliente,
CONVERT(bit, CASE WHEN U.CveRol = 3 THEN 1 ELSE 0 END) AS EsDesarrollador
FROM dbo.Sis_Usuarios AS U
INNER JOIN dbo.Sis_Roles AS R
ON R.CveRol = U.CveRol
OUTER APPLY
(
SELECT TOP (1) UC.CveCliente
FROM dbo.Sis_UsuariosClientes AS UC
INNER JOIN dbo.Clientes AS C
ON C.CveCliente = UC.CveCliente
AND C.Estatus = 1
WHERE UC.CveUsuario = U.CveUsuario
AND UC.Activo = 1
ORDER BY
UC.EsPrincipal DESC,
UC.Orden,
UC.CveUsuarioCliente
) AS ClientePrincipal
WHERE U.CveUsuario = @CveUsuario;
SELECT
C.CveCliente,
C.Nombre,
C.NombreComercial,
C.Direccion,
C.NoExt,
C.NoInt,
C.Colonia,
C.Ciudad,
C.Estado,
C.Pais,
C.RFC,
C.CP,
C.Telefono,
C.Mail,
C.CveRegimenFiscal,
RF.CodigoRegimenFiscal,
RF.RegimenFiscal,
C.CveUsoCFDI,
UCFDI.UsoCFDI,
UCFDI.Descripcion AS DescripcionUsoCFDI
FROM dbo.Sis_Usuarios AS U
CROSS APPLY
(
SELECT TOP (1) UC.CveCliente
FROM dbo.Sis_UsuariosClientes AS UC
INNER JOIN dbo.Clientes AS ClienteActivo
ON ClienteActivo.CveCliente = UC.CveCliente
AND ClienteActivo.Estatus = 1
WHERE UC.CveUsuario = U.CveUsuario
AND UC.Activo = 1
ORDER BY
UC.EsPrincipal DESC,
UC.Orden,
UC.CveUsuarioCliente
) AS ClientePrincipal
INNER JOIN dbo.Clientes AS C
ON C.CveCliente = ClientePrincipal.CveCliente
LEFT JOIN dbo.Gral_RegimenesFiscales AS RF
ON RF.CveRegimenFiscal = C.CveRegimenFiscal
LEFT JOIN dbo.Gral_SAT_UsosCFDI AS UCFDI
ON UCFDI.CveUsoCFDI = C.CveUsoCFDI
WHERE U.CveUsuario = @CveUsuario
AND U.CveRol = 3;
SELECT
CveRegimenFiscal,
CodigoRegimenFiscal,
RegimenFiscal
FROM dbo.Gral_RegimenesFiscales
ORDER BY CodigoRegimenFiscal;
SELECT
CveUsoCFDI,
UsoCFDI,
Descripcion
FROM dbo.Gral_SAT_UsosCFDI
ORDER BY UsoCFDI;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar el perfil; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Sis_PerfilGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Sis_PerfilSesionUpdate
@CveUsuario int,
@NombreUsuario varchar(100),
@HashContrasena varchar(500) = NULL,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SET @NombreUsuario = LTRIM(RTRIM(@NombreUsuario));
SET @HashContrasena = NULLIF(LTRIM(RTRIM(@HashContrasena)), '');
IF NOT EXISTS
(
SELECT 1
FROM dbo.Sis_Usuarios
WHERE CveUsuario = @CveUsuario
AND Activo = 1
)
BEGIN
SELECT
@ErrorMostrar = 'No se encontró el usuario activo de la sesión.',
@ErrorTipo = 2;
RETURN;
END;
IF NULLIF(@NombreUsuario, '') IS NULL
OR LEN(@NombreUsuario) < 3
BEGIN
SELECT
@ErrorMostrar = 'El nombre de usuario debe contener al menos tres caracteres.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Sis_Usuarios
WHERE NombreUsuario = @NombreUsuario
AND CveUsuario <> @CveUsuario
)
BEGIN
SELECT
@ErrorMostrar = 'El nombre de usuario ya está registrado.',
@ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Sis_Usuarios
SET NombreUsuario = @NombreUsuario,
HashContrasena = COALESCE(@HashContrasena, HashContrasena),
DebeCambiarContrasena =
CASE
WHEN @HashContrasena IS NULL
THEN DebeCambiarContrasena
ELSE 0
END,
FechaActualizacion = GETDATE()
WHERE CveUsuario = @CveUsuario;
SELECT
U.CveUsuario,
U.NombreUsuario,
U.CorreoElectronico,
U.CveRol,
R.NombreRol,
ISNULL(ClientePrincipal.CveCliente, 0) AS CveCliente,
CONVERT(bit, CASE WHEN U.CveRol = 3 THEN 1 ELSE 0 END) AS EsDesarrollador
FROM dbo.Sis_Usuarios AS U
INNER JOIN dbo.Sis_Roles AS R
ON R.CveRol = U.CveRol
OUTER APPLY
(
SELECT TOP (1) UC.CveCliente
FROM dbo.Sis_UsuariosClientes AS UC
INNER JOIN dbo.Clientes AS C
ON C.CveCliente = UC.CveCliente
AND C.Estatus = 1
WHERE UC.CveUsuario = U.CveUsuario
AND UC.Activo = 1
ORDER BY
UC.EsPrincipal DESC,
UC.Orden,
UC.CveUsuarioCliente
) AS ClientePrincipal
WHERE U.CveUsuario = @CveUsuario;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al actualizar los datos de sesión; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Sis_PerfilSesionUpdate'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Clientes_PerfilUpdate
@CveCliente int,
@Nombre varchar(200),
@NombreComercial varchar(200) = NULL,
@Direccion varchar(90),
@NoExt varchar(20) = NULL,
@NoInt varchar(50) = NULL,
@Colonia varchar(50),
@Ciudad varchar(50),
@Estado varchar(35),
@Pais varchar(50),
@RFC varchar(15),
@CP varchar(10),
@Telefono varchar(25) = NULL,
@Mail varchar(500) = NULL,
@CveRegimenFiscal tinyint,
@CveUsoCFDI tinyint,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SELECT
@Nombre = LTRIM(RTRIM(@Nombre)),
@NombreComercial = NULLIF(LTRIM(RTRIM(@NombreComercial)), ''),
@Direccion = LTRIM(RTRIM(@Direccion)),
@NoExt = NULLIF(LTRIM(RTRIM(@NoExt)), ''),
@NoInt = NULLIF(LTRIM(RTRIM(@NoInt)), ''),
@Colonia = LTRIM(RTRIM(@Colonia)),
@Ciudad = LTRIM(RTRIM(@Ciudad)),
@Estado = LTRIM(RTRIM(@Estado)),
@Pais = LTRIM(RTRIM(@Pais)),
@RFC = UPPER(REPLACE(LTRIM(RTRIM(@RFC)), ' ', '')),
@CP = LTRIM(RTRIM(@CP)),
@Telefono = NULLIF(LTRIM(RTRIM(@Telefono)), ''),
@Mail = NULLIF(LTRIM(RTRIM(@Mail)), '');
IF NOT EXISTS
(
SELECT 1
FROM dbo.Clientes
WHERE CveCliente = @CveCliente
AND Estatus = 1
)
BEGIN
SELECT
@ErrorMostrar = 'No se encontró el cliente activo del perfil.',
@ErrorTipo = 2;
RETURN;
END;
IF NULLIF(@Nombre, '') IS NULL
OR NULLIF(@Direccion, '') IS NULL
OR NULLIF(@Colonia, '') IS NULL
OR NULLIF(@Ciudad, '') IS NULL
OR NULLIF(@Estado, '') IS NULL
OR NULLIF(@Pais, '') IS NULL
OR LEN(@RFC) NOT IN (12, 13)
OR LEN(@CP) <> 5
BEGIN
SELECT
@ErrorMostrar = 'Capture nombre fiscal, domicilio, RFC y código postal válidos.',
@ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Gral_RegimenesFiscales
WHERE CveRegimenFiscal = @CveRegimenFiscal
)
BEGIN
SELECT
@ErrorMostrar = 'Seleccione un régimen fiscal válido.',
@ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Gral_SAT_UsosCFDI
WHERE CveUsoCFDI = @CveUsoCFDI
)
BEGIN
SELECT
@ErrorMostrar = 'Seleccione un uso de CFDI válido.',
@ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Clientes
SET Nombre = @Nombre,
NombreComercial = @NombreComercial,
Direccion = @Direccion,
NoExt = @NoExt,
NoInt = @NoInt,
Colonia = @Colonia,
Ciudad = @Ciudad,
Estado = @Estado,
Pais = @Pais,
RFC = @RFC,
CP = @CP,
Telefono = @Telefono,
Mail = @Mail,
CveRegimenFiscal = @CveRegimenFiscal,
CveUsoCFDI = @CveUsoCFDI,
CveUsuarioModifico = @CveUsuarioEjecuta
WHERE CveCliente = @CveCliente;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al actualizar los datos del cliente; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Clientes_PerfilUpdate'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Sis_UsuarioContextoList
@Texto varchar(150) = NULL,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SET @Texto = NULLIF(LTRIM(RTRIM(@Texto)), '');
SELECT
U.CveUsuario,
U.NombreUsuario,
U.CorreoElectronico,
U.CveRol,
R.NombreRol,
U.DebeCambiarContrasena,
ISNULL(ClientePrincipal.CveCliente, 0) AS CveCliente,
ClientePrincipal.Cliente
FROM dbo.Sis_Usuarios AS U
INNER JOIN dbo.Sis_Roles AS R
ON R.CveRol = U.CveRol
OUTER APPLY
(
SELECT TOP (1)
UC.CveCliente,
C.Nombre AS Cliente
FROM dbo.Sis_UsuariosClientes AS UC
INNER JOIN dbo.Clientes AS C
ON C.CveCliente = UC.CveCliente
AND C.Estatus = 1
WHERE UC.CveUsuario = U.CveUsuario
AND UC.Activo = 1
ORDER BY
UC.EsPrincipal DESC,
UC.Orden,
UC.CveUsuarioCliente
) AS ClientePrincipal
WHERE U.Activo = 1
AND
(
@Texto IS NULL
OR U.NombreUsuario LIKE '%' + @Texto + '%'
OR U.CorreoElectronico LIKE '%' + @Texto + '%'
OR ClientePrincipal.Cliente LIKE '%' + @Texto + '%'
)
ORDER BY U.NombreUsuario;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar los usuarios disponibles; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Sis_UsuarioContextoList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Sis_UsuarioContextoGet
@CveUsuario int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.Sis_Usuarios
WHERE CveUsuario = @CveUsuario
AND Activo = 1
)
BEGIN
SELECT
@ErrorMostrar = 'El usuario seleccionado ya no está disponible.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
U.CveUsuario,
U.NombreUsuario,
U.CorreoElectronico,
U.CveRol,
R.NombreRol,
U.DebeCambiarContrasena,
ISNULL(ClientePrincipal.CveCliente, 0) AS CveCliente,
ClientePrincipal.Cliente
FROM dbo.Sis_Usuarios AS U
INNER JOIN dbo.Sis_Roles AS R
ON R.CveRol = U.CveRol
OUTER APPLY
(
SELECT TOP (1)
UC.CveCliente,
C.Nombre AS Cliente
FROM dbo.Sis_UsuariosClientes AS UC
INNER JOIN dbo.Clientes AS C
ON C.CveCliente = UC.CveCliente
AND C.Estatus = 1
WHERE UC.CveUsuario = U.CveUsuario
AND UC.Activo = 1
ORDER BY
UC.EsPrincipal DESC,
UC.Orden,
UC.CveUsuarioCliente
) AS ClientePrincipal
WHERE U.CveUsuario = @CveUsuario;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al obtener el usuario seleccionado; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Sis_UsuarioContextoGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO

View File

@@ -46,7 +46,6 @@ CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioLoginSuccessUpdate]
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
@@ -87,7 +86,6 @@ CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioLoginFailedUpdate]
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
@@ -136,7 +134,6 @@ CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_IntentoInicioSesionAdd]
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
@@ -172,7 +169,6 @@ CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioSesionAdd]
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
@@ -215,7 +211,6 @@ CREATE OR ALTER PROCEDURE [dbo].[PA_Sis_UsuarioSesionEnd]
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
@@ -326,7 +321,6 @@ BEGIN
WHERE RM.[CveRol] = @CveRol
AND RM.[PuedeVer] = (1)
AND M.[Activo] = (1)
AND M.[Visible] = (1)
AND RM.[Borrado] = (0)
AND M.[Borrado] = (0)
AND

Binary file not shown.

View File

@@ -1,103 +1,19 @@
<%@ Page Title="Acceso denegado" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="AccessDenied.aspx.cs" Inherits="SIG.Web.AccessDenied" %>
<%@ Page Title="Acceso denegado"
Language="C#"
MasterPageFile="~/Site.master"
AutoEventWireup="true"
CodeFile="AccessDenied.aspx.cs"
Inherits="SIG.Web.AccessDenied" %>
<asp:Content ID="ContentHead" ContentPlaceHolderID="H" runat="server">
<style type="text/css">
.access-denied-wrapper {
display: flex;
align-items: center;
justify-content: center;
min-height: calc(100vh - 190px);
padding: 30px 15px;
}
.access-denied-card {
width: 100%;
max-width: 680px;
padding: 42px 38px;
background: #ffffff;
border-top: 4px solid #e7505a;
box-shadow: 0 4px 18px rgba(0, 0, 0, .10);
text-align: center;
}
.access-denied-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 84px;
height: 84px;
margin-bottom: 18px;
border-radius: 50%;
color: #e7505a;
background: #fbeaec;
font-size: 38px;
}
.access-denied-code {
margin: 0 0 4px;
color: #e7505a;
font-size: 18px;
font-weight: 700;
letter-spacing: 2px;
}
.access-denied-title {
margin: 0 0 14px;
color: #34495e;
font-size: 30px;
font-weight: 600;
}
.access-denied-message {
max-width: 520px;
margin: 0 auto 28px;
color: #697882;
font-size: 15px;
line-height: 1.7;
}
.access-denied-actions .btn {
margin: 4px;
}
@media (max-width: 600px) {
.access-denied-card {
padding: 32px 20px;
}
.access-denied-title {
font-size: 25px;
}
}
</style>
</asp:Content>
<asp:Content ID="ContentMain" ContentPlaceHolderID="C" runat="server">
<div class="access-denied-wrapper">
<section class="access-denied-card" aria-labelledby="accessDeniedTitle">
<div class="access-denied-icon" aria-hidden="true">
<i class="fa fa-lock"></i>
</div>
<p class="access-denied-code">ERROR 403</p>
<h1 id="accessDeniedTitle" class="access-denied-title">Acceso denegado</h1>
<p class="access-denied-message">
Tu sesión está activa, pero tu usuario no cuenta con permiso para consultar esta página.
Si necesitas acceso, solicita la autorización correspondiente al administrador del sistema.
</p>
<div class="access-denied-actions">
<a class="btn blue" href="<%= ResolveUrl("~/Inicio.aspx") %>">
<i class="fa fa-home"></i> Ir al inicio
</a>
<button type="button" class="btn default" onclick="window.history.back();">
<i class="fa fa-arrow-left"></i> Regresar
</button>
<a class="btn red" href="<%= ResolveUrl("~/Logout.aspx") %>">
<i class="fa fa-sign-out"></i> Cerrar sesión
</a>
</div>
</section>
<div class="note note-warning">
<h4 class="block">Acceso denegado</h4>
<p>
No cuenta con acceso a esta página desde el menú asignado a su usuario.
</p>
</div>
</asp:Content>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>
<ajaxControlToolkit>
<controlBundles>
<controlBundle name="Accordion">

View File

@@ -1,59 +0,0 @@
using SIG.Web.AppCode.Contracts.Database;
using SIG.Web.AppCode.Contracts.Search;
using SIG.Web.AppCode.Contracts.Security;
using SIG.Web.AppCode.Notifications.Contracts;
using SIG.Web.AppCode.Notifications.Services;
using SIG.Web.AppCode.Repositories.Security;
using SIG.Web.AppCode.Services.Database;
using SIG.Web.AppCode.Services.Menu;
using SIG.Web.AppCode.Services.Search;
using SIG.Web.AppCode.Services.Security;
using SIG.Web.AppCode.Session;
namespace SIG.Web.AppCode.Configuration
{
public static class AppServices
{
public static IDbConnectionFactory DbConnectionFactory { get; private set; }
public static IDbExecutor DbExecutor { get; private set; }
public static IPasswordHasher PasswordHasher { get; private set; }
public static IUserRepository UserRepository { get; private set; }
public static IUserAdministrationRepository UserAdministrationRepository { get; private set; }
public static IPublicRegistrationService PublicRegistrationService { get; private set; }
public static ILoginAttemptRepository LoginAttemptRepository { get; private set; } public static IUserSessionRepository UserSessionRepository { get; private set; }
public static ILoginService LoginService { get; private set; }
public static IUserContextProvider UserContext { get; private set; }
public static IPermissionService PermissionService { get; private set; }
public static IMenuProvider MenuProvider { get; private set; }
public static INotificationCenter NotificationCenter { get; private set; }
public static IBuscadorCatalogoDataProvider SearchProvider { get; private set; }
public static void Configure()
{
DbConnectionFactory = new DbConnectionFactory();
DbExecutor = new DbExecutor(DbConnectionFactory);
PasswordHasher = new PasswordHasher();
UserRepository = new UserRepository(DbExecutor);
UserAdministrationRepository = new UserAdministrationRepository(DbExecutor);
LoginAttemptRepository = new LoginAttemptRepository(DbExecutor); UserSessionRepository = new UserSessionRepository(DbExecutor);
UserContext = new WebFormsUserContextProvider();
PermissionService = new PermissionService(DbExecutor);
MenuProvider = new MenuProvider(DbExecutor);
NotificationCenter = new DummyNotificationCenter();
SearchProvider = new DummyBuscadorCatalogoDataProvider();
LoginService = new LoginService(
UserRepository,
PasswordHasher,
LoginAttemptRepository,
UserSessionRepository);
PublicRegistrationService = new PublicRegistrationService(
UserAdministrationRepository,
PasswordHasher,
new SmtpEmailSender());
} }
}

View File

@@ -1,8 +0,0 @@
using SIG.Web.AppCode.Session;
namespace SIG.Web.AppCode.Contracts.Security
{
public interface IUserContextProvider
{
bool IsAuthenticated(); UserSessionModel GetCurrentUser(); void SetCurrentUser(UserSessionModel user); void Clear();
}
}

View File

@@ -1,12 +0,0 @@
using SIG.Web.AppCode.Session;
namespace SIG.Web.AppCode.Models.Security
{
public sealed class LoginResult
{
public bool Exitoso { get; private set; }
public string Mensaje { get; private set; }
public UserSessionModel Usuario { get; private set; }
public static LoginResult Ok(UserSessionModel usuario) { return new LoginResult { Exitoso = true, Usuario = usuario, Mensaje = string.Empty }; }
public static LoginResult Fail(string mensaje) { return new LoginResult { Exitoso = false, Mensaje = mensaje }; }
}
}

View File

@@ -1,40 +0,0 @@
using System.Data;
using SIG.Web.AppCode.Contracts.Database;
using SIG.Web.AppCode.Contracts.Security;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Services.Database;
namespace SIG.Web.AppCode.Repositories.Security
{
public sealed class LoginAttemptRepository : ILoginAttemptRepository
{
private readonly IDbExecutor _dbExecutor;
public LoginAttemptRepository(IDbExecutor dbExecutor)
{
_dbExecutor = dbExecutor;
}
public DbResult<bool> Save(int? cveUser, string username, bool wasSuccessful, string failureReason, string ipAddress, string userAgent, string domainName)
{
return _dbExecutor.Execute(domainName, connection =>
{
using (IDbCommand command = connection.CreateCommand())
{
StoredProcedureCommand.Configure(command, "dbo.PA_Sis_IntentoInicioSesionAdd", cveUser ?? 0);
StoredProcedureCommand.AddInput(command, "@CveUsuario", cveUser.HasValue ? (object)cveUser.Value : null, DbType.Int32);
StoredProcedureCommand.AddInput(command, "@NombreUsuario", username, DbType.String);
StoredProcedureCommand.AddInput(command, "@Exitoso", wasSuccessful, DbType.Boolean);
StoredProcedureCommand.AddInput(command, "@MotivoFallo", failureReason, DbType.String);
StoredProcedureCommand.AddInput(command, "@DireccionIP", ipAddress, DbType.String);
StoredProcedureCommand.AddInput(command, "@AgenteUsuario", userAgent, DbType.String);
StoredProcedureCommand.AddInput(command, "@NombreDominio", domainName, DbType.String);
command.ExecuteNonQuery();
StoredProcedureCommand.EnsureSuccess(command);
return true;
}
});
}
}
}

View File

@@ -1,68 +0,0 @@
using System;
using System.Data;
using SIG.Web.AppCode.Contracts.Database;
using SIG.Web.AppCode.Contracts.Security;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Security;
using SIG.Web.AppCode.Services.Database;
using SIG.Web.AppCode.Utilities;
namespace SIG.Web.AppCode.Repositories.Security
{
public sealed class UserRepository : IUserRepository
{
private readonly IDbExecutor _dbExecutor;
public UserRepository(IDbExecutor dbExecutor)
{
_dbExecutor = dbExecutor;
}
public DbResult<UserModel> ObtenerPorNombreUsuario(string username, string domainName)
{
return _dbExecutor.Execute(domainName, connection =>
{
using (IDbCommand command = connection.CreateCommand())
{
StoredProcedureCommand.Configure(command, "dbo.PA_Sis_UsuarioGetByName", 0);
StoredProcedureCommand.AddInput(command, "@NombreUsuario", username, DbType.String);
UserModel user;
using (IDataReader reader = command.ExecuteReader())
{
user = reader.ToObject<UserModel>();
}
StoredProcedureCommand.EnsureSuccess(command);
return user;
}
});
}
public DbResult<bool> RegisterSuccessfulLogin(int cveUser, string domainName)
{
return ExecuteUserUpdate("dbo.PA_Sis_UsuarioLoginSuccessUpdate", cveUser, domainName);
}
public DbResult<bool> RegisterFailedLogin(int cveUser, string domainName)
{
return ExecuteUserUpdate("dbo.PA_Sis_UsuarioLoginFailedUpdate", cveUser, domainName);
}
private DbResult<bool> ExecuteUserUpdate(string procedureName, int cveUser, string domainName)
{
return _dbExecutor.Execute(domainName, connection =>
{
using (IDbCommand command = connection.CreateCommand())
{
StoredProcedureCommand.Configure(command, procedureName, cveUser);
StoredProcedureCommand.AddInput(command, "@CveUsuario", cveUser, DbType.Int32);
command.ExecuteNonQuery();
StoredProcedureCommand.EnsureSuccess(command);
return true;
}
});
}
}
}

View File

@@ -1,54 +0,0 @@
using System.Data;
using SIG.Web.AppCode.Contracts.Database;
using SIG.Web.AppCode.Contracts.Security;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Services.Database;
namespace SIG.Web.AppCode.Repositories.Security
{
public sealed class UserSessionRepository : IUserSessionRepository
{
private readonly IDbExecutor _dbExecutor;
public UserSessionRepository(IDbExecutor dbExecutor)
{
_dbExecutor = dbExecutor;
}
public DbResult<bool> StartSession(int cveUser, string sessionToken, string ipAddress, string userAgent, string domainName)
{
return _dbExecutor.Execute(domainName, connection =>
{
using (IDbCommand command = connection.CreateCommand())
{
StoredProcedureCommand.Configure(command, "dbo.PA_Sis_UsuarioSesionAdd", cveUser);
StoredProcedureCommand.AddInput(command, "@CveUsuario", cveUser, DbType.Int32);
StoredProcedureCommand.AddInput(command, "@TokenSesion", sessionToken, DbType.String);
StoredProcedureCommand.AddInput(command, "@DireccionIP", ipAddress, DbType.String);
StoredProcedureCommand.AddInput(command, "@AgenteUsuario", userAgent, DbType.String);
StoredProcedureCommand.AddInput(command, "@NombreDominio", domainName, DbType.String);
command.ExecuteNonQuery();
StoredProcedureCommand.EnsureSuccess(command);
return true;
}
});
}
public DbResult<bool> EndSession(string sessionToken, string domainName)
{
return _dbExecutor.Execute(domainName, connection =>
{
using (IDbCommand command = connection.CreateCommand())
{
StoredProcedureCommand.Configure(command, "dbo.PA_Sis_UsuarioSesionEnd", 0);
StoredProcedureCommand.AddInput(command, "@TokenSesion", sessionToken, DbType.String);
command.ExecuteNonQuery();
StoredProcedureCommand.EnsureSuccess(command);
return true;
}
});
}
}
}

View File

@@ -1,106 +0,0 @@
using System;
using System.Configuration;
using System.IO;
using System.Text;
using System.Web;
namespace SIG.Web.AppCode.Services.Logging
{
public static class ExceptionLogger
{
private static readonly object LockObject = new object();
public static void Log(Exception exception, string source)
{
Log(exception, source, null);
}
public static void Log(Exception exception, string source, string userMessage)
{
try
{
if (exception == null)
{
return;
}
string logPath = GetLogPath();
string directory = Path.GetDirectoryName(logPath);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
string content = BuildLogContent(exception, source, userMessage);
lock (LockObject)
{
File.AppendAllText(logPath, content, Encoding.UTF8);
}
}
catch
{
// Never throw from the logger.
// If the logger fails, the application must continue.
}
}
private static string GetLogPath()
{
string configuredPath = ConfigurationManager.AppSettings["ExceptionLogFilePath"];
if (string.IsNullOrWhiteSpace(configuredPath))
{
configuredPath = "~/log/log.txt";
}
if (HttpContext.Current != null)
{
return HttpContext.Current.Server.MapPath(configuredPath);
}
return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "log.txt");
}
private static string BuildLogContent(Exception exception, string source, string userMessage)
{
var sb = new StringBuilder();
sb.AppendLine("============================================================");
sb.AppendLine("Date: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
sb.AppendLine("Source: " + Safe(source));
sb.AppendLine("UserMessage: " + Safe(userMessage));
HttpContext context = HttpContext.Current;
if (context != null && context.Request != null)
{
sb.AppendLine("Url: " + Safe(context.Request.Url != null ? context.Request.Url.ToString() : null));
sb.AppendLine("HttpMethod: " + Safe(context.Request.HttpMethod));
sb.AppendLine("DireccionIP: " + Safe(context.Request.UserHostAddress));
sb.AppendLine("AgenteUsuario: " + Safe(context.Request.UserAgent));
}
if (context != null && context.User != null && context.User.Identity != null)
{
sb.AppendLine("Identity: " + Safe(context.User.Identity.Name));
sb.AppendLine("IsAuthenticated: " + context.User.Identity.IsAuthenticated);
}
sb.AppendLine("ExceptionType: " + exception.GetType().FullName);
sb.AppendLine("Message: " + exception.Message);
sb.AppendLine("BaseException: " + exception.GetBaseException().Message);
sb.AppendLine("StackTrace:");
sb.AppendLine(exception.ToString());
sb.AppendLine();
return sb.ToString();
}
private static string Safe(string value)
{
return string.IsNullOrWhiteSpace(value) ? string.Empty : value;
}
}
}

View File

@@ -1,85 +0,0 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using SIG.Web.AppCode.Contracts.Database;
using SIG.Web.AppCode.Services.Database;
using SIG.Web.AppCode.Utilities;
using SIG.Web.AppCode.Session;
namespace SIG.Web.AppCode.Services.Menu
{
public sealed class MenuProvider : IMenuProvider
{
private readonly IDbExecutor _dbExecutor;
public MenuProvider(IDbExecutor dbExecutor)
{
_dbExecutor = dbExecutor;
}
public IReadOnlyList<MenuItemModel> GetMenu(UserSessionModel user)
{
if (user == null)
{
return new List<MenuItemModel>();
}
var modulesResult = GetModules(user);
if (!modulesResult.Success || modulesResult.Data == null)
{
return new List<MenuItemModel>();
}
return BuildTree(modulesResult.Data);
}
private SIG.Web.AppCode.Models.Common.DbResult<List<MenuItemModel>> GetModules(UserSessionModel user)
{
return _dbExecutor.Execute(user.NombreDominio, connection =>
{
using (IDbCommand command = connection.CreateCommand())
{
StoredProcedureCommand.Configure(command, "dbo.PA_Sis_MenuList", user.CveUsuario);
StoredProcedureCommand.AddInput(command, "@CveRol", user.CveRol, DbType.Int32);
List<MenuItemModel> items;
using (IDataReader reader = command.ExecuteReader())
{
items = reader.ToList<MenuItemModel>();
}
StoredProcedureCommand.EnsureSuccess(command);
return items;
}
});
}
private static IReadOnlyList<MenuItemModel> BuildTree(List<MenuItemModel> flatItems)
{
if (flatItems == null || flatItems.Count == 0)
{
return new List<MenuItemModel>();
}
var byId = flatItems.ToDictionary(x => x.CveModulo);
var roots = new List<MenuItemModel>();
foreach (var item in flatItems.OrderBy(x => x.OrdenVisualizacion).ThenBy(x => x.NombreModulo))
{
if (item.CveModuloPadre.HasValue && byId.ContainsKey(item.CveModuloPadre.Value))
{
byId[item.CveModuloPadre.Value].Hijos.Add(item);
}
else
{
roots.Add(item);
}
}
return roots;
}
}
}

View File

@@ -1,118 +0,0 @@
using System;
using SIG.Web.AppCode.Contracts.Security;
using SIG.Web.AppCode.Models.Security;
using SIG.Web.AppCode.Session;
namespace SIG.Web.AppCode.Services.Security
{
public sealed class LoginService : ILoginService
{
private const string GenericError = "No fue posible iniciar sesion. Verifique sus datos.";
private readonly IUserRepository _userRepository;
private readonly IPasswordHasher _passwordHasher;
private readonly ILoginAttemptRepository _loginAttemptRepository;
private readonly IUserSessionRepository _userSessionRepository;
public LoginService(
IUserRepository userRepository,
IPasswordHasher passwordHasher,
ILoginAttemptRepository loginAttemptRepository,
IUserSessionRepository userSessionRepository)
{
_userRepository = userRepository;
_passwordHasher = passwordHasher;
_loginAttemptRepository = loginAttemptRepository;
_userSessionRepository = userSessionRepository;
}
public LoginResult Login(LoginRequest request)
{
if (request == null || string.IsNullOrWhiteSpace(request.NombreUsuario) || string.IsNullOrWhiteSpace(request.Contrasena))
{
return LoginResult.Fail(GenericError);
}
string username = request.NombreUsuario.Trim();
var userResult = _userRepository.ObtenerPorNombreUsuario(username, request.NombreDominio);
if (!userResult.Success)
{
return LoginResult.Fail(userResult.UserMessage);
}
UserModel user = userResult.Data;
if (user == null)
{
_loginAttemptRepository.Save(null, username, false, "UserNotFound", request.DireccionIP, request.AgenteUsuario, request.NombreDominio);
return LoginResult.Fail(GenericError);
}
if (!user.CorreoVerificado)
{
_loginAttemptRepository.Save(user.CveUsuario, username, false, "EmailNotVerified", request.DireccionIP, request.AgenteUsuario, request.NombreDominio);
return LoginResult.Fail("Debes verificar tu correo electrónico antes de iniciar sesión.");
}
if (!user.Activo)
{
_loginAttemptRepository.Save(user.CveUsuario, username, false, "InactiveUser", request.DireccionIP, request.AgenteUsuario, request.NombreDominio);
return LoginResult.Fail("El usuario se encuentra inactivo.");
}
if (user.BloqueadoHasta.HasValue && user.BloqueadoHasta.Value > DateTime.Now) {
_loginAttemptRepository.Save(user.CveUsuario, username, false, "LockedUser", request.DireccionIP, request.AgenteUsuario, request.NombreDominio);
return LoginResult.Fail("El usuario se encuentra bloqueado temporalmente.");
}
if (!_passwordHasher.VerifyPassword(request.Contrasena, user.HashContrasena))
{
_userRepository.RegisterFailedLogin(user.CveUsuario, request.NombreDominio);
_loginAttemptRepository.Save(user.CveUsuario, username, false, "InvalidPassword", request.DireccionIP, request.AgenteUsuario, request.NombreDominio);
return LoginResult.Fail(GenericError);
}
string sessionToken = Guid.NewGuid().ToString("N");
var loginUpdateResult = _userRepository.RegisterSuccessfulLogin(user.CveUsuario, request.NombreDominio);
if (!loginUpdateResult.Success)
{
return LoginResult.Fail(loginUpdateResult.UserMessage);
}
var sessionResult = _userSessionRepository.StartSession(user.CveUsuario, sessionToken, request.DireccionIP, request.AgenteUsuario, request.NombreDominio);
if (!sessionResult.Success)
{
return LoginResult.Fail(sessionResult.UserMessage);
}
_loginAttemptRepository.Save(user.CveUsuario, username, true, null, request.DireccionIP, request.AgenteUsuario, request.NombreDominio);
var sessionUser = new UserSessionModel
{
CveUsuario = user.CveUsuario,
CveRol = user.CveRol,
NombreUsuario = user.NombreUsuario,
Nombre = user.NombreUsuario,
CorreoElectronico = user.CorreoElectronico,
NombreRol = user.NombreRol,
NombreDominio = request.NombreDominio,
TokenSesion = sessionToken,
DebeCambiarContrasena = user.DebeCambiarContrasena
};
return LoginResult.Ok(sessionUser);
}
public void Logout(string sessionToken, string domainName)
{
if (!string.IsNullOrWhiteSpace(sessionToken))
{
_userSessionRepository.EndSession(sessionToken, domainName);
}
}
}
}

View File

@@ -1,40 +0,0 @@
using System;
using System.Security.Cryptography;
using SIG.Web.AppCode.Contracts.Security;
namespace SIG.Web.AppCode.Services.Security
{
public sealed class PasswordHasher : IPasswordHasher
{
private const int SaltSize = 16;
private const int HashSize = 32;
private const int Iterations = 100000;
public string HashPassword(string password)
{
byte[] salt = new byte[SaltSize];
using (var rng = RandomNumberGenerator.Create()) rng.GetBytes(salt);
byte[] hash = Derive(password, salt, Iterations);
return "PBKDF2-SHA256$" + Iterations + "$" + Convert.ToBase64String(salt) + "$" + Convert.ToBase64String(hash);
}
public bool VerifyPassword(string password, string storedHash)
{
if (string.IsNullOrWhiteSpace(password) || string.IsNullOrWhiteSpace(storedHash)) return false;
string[] parts = storedHash.Split('$');
if (parts.Length != 4 || parts[0] != "PBKDF2-SHA256") return false;
int iterations; if (!int.TryParse(parts[1], out iterations)) return false;
byte[] salt = Convert.FromBase64String(parts[2]);
byte[] expected = Convert.FromBase64String(parts[3]);
byte[] actual = Derive(password, salt, iterations);
return FixedTimeEquals(actual, expected);
}
private static byte[] Derive(string password, byte[] salt, int iterations)
{
using (var pbkdf2 = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256)) return pbkdf2.GetBytes(HashSize);
}
private static bool FixedTimeEquals(byte[] left, byte[] right)
{
if (left == null || right == null || left.Length != right.Length) return false;
int diff = 0; for (int i = 0; i < left.Length; i++) diff |= left[i] ^ right[i];
return diff == 0;
}
}
}

View File

@@ -1,101 +0,0 @@
using System;
using System.Data;
using SIG.Web.AppCode.Contracts.Database;
using SIG.Web.AppCode.Contracts.Security;
using SIG.Web.AppCode.Services.Database;
namespace SIG.Web.AppCode.Services.Security
{
public sealed class PermissionService : IPermissionService
{
private readonly IDbExecutor _dbExecutor;
public PermissionService(IDbExecutor dbExecutor)
{
_dbExecutor = dbExecutor;
}
public bool HasPermission(int cveUser, string permissionCode)
{
if (cveUser <= 0 || string.IsNullOrWhiteSpace(permissionCode))
{
return false;
}
var result = _dbExecutor.Execute(null, connection =>
{
using (IDbCommand command = connection.CreateCommand())
{
StoredProcedureCommand.Configure(command, "dbo.PA_Sis_PermisoCheck", cveUser);
StoredProcedureCommand.AddInput(command, "@CodigoPermiso", permissionCode.Trim(), DbType.String);
object value = command.ExecuteScalar();
StoredProcedureCommand.EnsureSuccess(command);
return value != null && value != DBNull.Value && Convert.ToBoolean(value);
}
});
return result.Success && result.Data;
}
public bool CanAccessPage(int cveUser, string pageUrl)
{
if (cveUser <= 0)
{
return false;
}
string normalizedUrl = NormalizePageUrl(pageUrl);
if (IsPublicPage(normalizedUrl))
{
return true;
}
var result = _dbExecutor.Execute(null, connection =>
{
using (IDbCommand command = connection.CreateCommand())
{
StoredProcedureCommand.Configure(command, "dbo.PA_Sis_PaginaAccessCheck", cveUser);
StoredProcedureCommand.AddInput(command, "@PaginaUrl", normalizedUrl, DbType.String);
object value = command.ExecuteScalar();
StoredProcedureCommand.EnsureSuccess(command);
return value != null && value != DBNull.Value && Convert.ToBoolean(value);
}
});
return result.Success && result.Data;
}
private static string NormalizePageUrl(string pageUrl)
{
if (string.IsNullOrWhiteSpace(pageUrl))
{
return string.Empty;
}
string value = pageUrl.Trim();
if (value.StartsWith("~/", StringComparison.Ordinal))
{
value = value.Substring(2);
}
if (value.StartsWith("/", StringComparison.Ordinal))
{
value = value.Substring(1);
}
return value;
}
private static bool IsPublicPage(string normalizedUrl)
{
return normalizedUrl.Equals("Login.aspx", StringComparison.OrdinalIgnoreCase) ||
normalizedUrl.Equals("Logout.aspx", StringComparison.OrdinalIgnoreCase) ||
normalizedUrl.Equals("AccessDenied.aspx", StringComparison.OrdinalIgnoreCase) ||
normalizedUrl.Equals("Error.aspx", StringComparison.OrdinalIgnoreCase);
}
}
}

View File

@@ -1,58 +0,0 @@
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using SIG.Web.AppCode.Contracts.Security;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Security;
namespace SIG.Web.AppCode.Services.Security
{
public sealed class PublicRegistrationService : IPublicRegistrationService
{
private readonly IUserAdministrationRepository _repository;
private readonly IPasswordHasher _passwordHasher;
private readonly IEmailSender _emailSender;
public PublicRegistrationService(IUserAdministrationRepository repository, IPasswordHasher passwordHasher, IEmailSender emailSender) { _repository = repository; _passwordHasher = passwordHasher; _emailSender = emailSender; }
public DbResult<bool> Validate(PublicRegistrationDraft draft, string domainName)
{
string error = ValidateRequired(draft);
return error == null ? _repository.ValidateRegistration(draft.NombreUsuario, draft.CorreoElectronico, draft.RFC, domainName) : DbResult<bool>.Fail(error, error, null);
}
public DbResult<List<StateOptionModel>> ListStates(string domainName) { return _repository.ListStates(domainName); }
public DbResult<bool> Register(PublicRegistrationDraft draft, string verificationBaseUrl, string domainName)
{
DbResult<bool> validation = Validate(draft, domainName); if (!validation.Success) return validation;
if (!_emailSender.IsConfigured) return DbResult<bool>.Fail("El envío de correo todavía no está configurado. Contacta a Sistemas.", "SMTP no configurado.", null);
string token = CreateToken();
DbResult<RegistrationCreatedModel> created = _repository.CreateRegistration(draft, _passwordHasher.HashPassword(draft.Contrasena), HashToken(token), domainName);
if (!created.Success) return DbResult<bool>.Fail(created.UserMessage, created.TechnicalMessage, created.Exception);
try
{
_emailSender.SendVerification(draft.CorreoElectronico, verificationBaseUrl + (verificationBaseUrl.Contains("?") ? "&" : "?") + "token=" + Uri.EscapeDataString(token));
return DbResult<bool>.Ok(true);
}
catch (Exception ex) { return DbResult<bool>.Fail("La cuenta quedó pendiente, pero no fue posible enviar el correo. Contacta a Sistemas para reenviarlo.", ex.Message, ex); }
}
public DbResult<bool> Verify(string token, string domainName)
{
return string.IsNullOrWhiteSpace(token) ? DbResult<bool>.Fail("La liga de verificación no es válida.", "Token vacío.", null) : _repository.VerifyEmail(HashToken(token), domainName);
}
private static string ValidateRequired(PublicRegistrationDraft d)
{
if (d == null) return "Captura los datos del registro.";
if (string.IsNullOrWhiteSpace(d.NombreUsuario) || string.IsNullOrWhiteSpace(d.CorreoElectronico) || string.IsNullOrWhiteSpace(d.Contrasena)) return "Completa los datos de usuario.";
if (d.Contrasena.Length < 8) return "La contraseña debe tener al menos 8 caracteres.";
if (string.IsNullOrWhiteSpace(d.RFC) || string.IsNullOrWhiteSpace(d.RazonSocial) || string.IsNullOrWhiteSpace(d.Direccion) || string.IsNullOrWhiteSpace(d.Colonia) || string.IsNullOrWhiteSpace(d.Ciudad) || d.CveSATEstado <= 0) return "Completa los datos obligatorios de la empresa.";
return null;
}
private static string CreateToken() { byte[] bytes = new byte[32]; using (var rng = RandomNumberGenerator.Create()) rng.GetBytes(bytes); return Convert.ToBase64String(bytes).TrimEnd('=').Replace('+', '-').Replace('/', '_'); }
private static string HashToken(string token) { using (SHA256 sha = SHA256.Create()) { byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(token)); var value = new StringBuilder(64); foreach (byte item in hash) value.Append(item.ToString("x2")); return value.ToString(); } }
}
}

View File

@@ -1,31 +0,0 @@
using System;
using System.Configuration;
using System.Net;
using System.Net.Mail;
using SIG.Web.AppCode.Contracts.Security;
namespace SIG.Web.AppCode.Services.Security
{
public sealed class SmtpEmailSender : IEmailSender
{
public bool IsConfigured { get { return !string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["SmtpHost"]) && !string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["EmailFrom"]); } }
public void SendVerification(string recipient, string verificationUrl)
{
if (!IsConfigured) throw new InvalidOperationException("El envío de correo no se encuentra configurado.");
int port; if (!int.TryParse(ConfigurationManager.AppSettings["SmtpPort"], out port)) port = 25;
bool ssl; bool.TryParse(ConfigurationManager.AppSettings["SmtpEnableSsl"], out ssl);
using (var message = new MailMessage(ConfigurationManager.AppSettings["EmailFrom"], recipient))
using (var client = new SmtpClient(ConfigurationManager.AppSettings["SmtpHost"], port))
{
message.Subject = "Verifica tu correo - Plataforma de Desarrolladores";
message.IsBodyHtml = true;
message.Body = "<p>Para concluir la creación de tu cuenta, abre la siguiente liga:</p><p><a href=\"" + WebUtility.HtmlEncode(verificationUrl) + "\">Verificar mi correo</a></p><p>La liga vence en 24 horas.</p>";
client.EnableSsl = ssl;
string user = ConfigurationManager.AppSettings["SmtpUser"];
if (!string.IsNullOrWhiteSpace(user)) client.Credentials = new NetworkCredential(user, ConfigurationManager.AppSettings["SmtpPassword"]);
client.Send(message);
}
}
}
}

View File

@@ -1,26 +0,0 @@
using System.Web;
using SIG.Web.AppCode.Contracts.Security;
using SIG.Web.AppCode.Session;
namespace SIG.Web.AppCode.Services.Security
{
public sealed class WebFormsUserContextProvider : Contracts.Security.IUserContextProvider
{
public bool IsAuthenticated() { return GetCurrentUser() != null; }
public UserSessionModel GetCurrentUser()
{
return HttpContext.Current == null || HttpContext.Current.Session == null ? null : HttpContext.Current.Session[SessionKeys.CurrentUser] as UserSessionModel;
}
public void SetCurrentUser(UserSessionModel user)
{
if (HttpContext.Current == null || HttpContext.Current.Session == null)
return; HttpContext.Current.Session[SessionKeys.CurrentUser] = user;
HttpContext.Current.Session[SessionKeys.TokenSesion] = user != null ? user.TokenSesion : null;
}
public void Clear()
{
if (HttpContext.Current == null || HttpContext.Current.Session == null)
return; HttpContext.Current.Session.Remove(SessionKeys.CurrentUser);
HttpContext.Current.Session.Remove(SessionKeys.TokenSesion);
}
}
}

View File

@@ -0,0 +1,215 @@
using System;
using System.Configuration;
using SIG.Web.AppCode.Contracts.Bitacora;
using SIG.Web.AppCode.Contracts.Database;
using SIG.Web.AppCode.Contracts.Documentos;
using SIG.Web.AppCode.Contracts.Facturacion;
using SIG.Web.AppCode.Contracts.Fraccionamientos;
using SIG.Web.AppCode.Contracts.General;
using SIG.Web.AppCode.Contracts.Menu;
using SIG.Web.AppCode.Contracts.Search;
using SIG.Web.AppCode.Contracts.Security;
using SIG.Web.AppCode.Contracts.Tramites;
using SIG.Web.AppCode.Contracts.Ventas;
using SIG.Web.AppCode.Notifications.Contracts;
using SIG.Web.AppCode.Notifications.Services;
using SIG.Web.AppCode.Repositories.Bitacora;
using SIG.Web.AppCode.Repositories.Database;
using SIG.Web.AppCode.Repositories.Documentos;
using SIG.Web.AppCode.Repositories.Facturacion;
using SIG.Web.AppCode.Repositories.General;
using SIG.Web.AppCode.Repositories.Menu;
using SIG.Web.AppCode.Repositories.Fraccionamientos;
using SIG.Web.AppCode.Repositories.Security;
using SIG.Web.AppCode.Repositories.Tramites;
using SIG.Web.AppCode.Repositories.Ventas;
using SIG.Web.AppCode.Services.Bitacora;
using SIG.Web.AppCode.Services.Documentos;
using SIG.Web.AppCode.Services.Facturacion;
using SIG.Web.AppCode.Services.Fraccionamientos;
using SIG.Web.AppCode.Services.General;
using SIG.Web.AppCode.Services.Menu;
using SIG.Web.AppCode.Services.Search;
using SIG.Web.AppCode.Services.Security;
using SIG.Web.AppCode.Services.Tramites;
using SIG.Web.AppCode.Services.Ventas;
using SIG.Web.AppCode.Session;
namespace SIG.Web.AppCode.Configuration
{
public static class AppServices
{
public static IDbConnectionFactory DbConnectionFactory { get; private set; }
private static IDbExecutor DbExecutor { get; set; }
public static IBitacoraService BitacoraService { get; private set; }
public static IPasswordHasher PasswordHasher { get; private set; }
public static ICaptchaService CaptchaService { get; private set; }
public static IUserRepository UserRepository { get; private set; }
private static IUserAdministrationRepository UserAdministrationRepository { get; set; }
public static IUserAdministrationService UserAdministrationService { get; private set; }
public static IServicioPerfilUsuario ServicioPerfilUsuario { get; private set; }
public static IGeneralCatalogRepository GeneralCatalogRepository { get; private set; }
public static IServicioProductoServicio ServicioProductoServicio { get; private set; }
public static IServicioCatalogoProducto ServicioCatalogoProducto { get; private set; }
public static IClienteDocumentoService ClienteDocumentoService { get; private set; }
public static ITramiteDocumentoService TramiteDocumentoService { get; private set; }
public static IServicioFraccionamiento ServicioFraccionamiento { get; private set; }
public static IServicioGisFraccionamiento ServicioGisFraccionamiento { get; private set; }
public static ITramiteCatalogService TramiteCatalogService { get; private set; }
public static ITramiteSolicitudService TramiteSolicitudService { get; private set; }
public static IServicioVentaTramite ServicioVentaTramite { get; private set; }
public static IServicioTimbradoCfdi ServicioTimbradoCfdi { get; private set; }
public static IPublicRegistrationService PublicRegistrationService { get; private set; }
public static ILoginAttemptRepository LoginAttemptRepository { get; private set; }
public static IUserSessionRepository UserSessionRepository { get; private set; }
public static ILoginService LoginService { get; private set; }
public static IUserContextProvider UserContext { get; private set; }
public static IPermissionService PermissionService { get; private set; }
public static IMenuProvider MenuProvider { get; private set; }
public static INotificationCenter NotificationCenter { get; private set; }
public static IBuscadorCatalogoDataProvider SearchProvider { get; private set; }
public static void Configure()
{
DbConnectionFactory = new DbConnectionFactory();
DbExecutor = new DbExecutor(DbConnectionFactory);
PasswordHasher = new PasswordHasher();
CaptchaService = new RecaptchaV2Service(
ReadBooleanSetting("RecaptchaEnabled", "SIG_RECAPTCHA_ENABLED", false),
ReadSetting("RecaptchaSiteKey", "SIG_RECAPTCHA_SITE_KEY"),
ReadSetting("RecaptchaSecretKey", "SIG_RECAPTCHA_SECRET_KEY"));
UserContext = new WebFormsUserContextProvider();
var bitacoraConnectionFactory =
new BitacoraDbConnectionFactory();
var bitacoraDbExecutor =
new DbExecutor(bitacoraConnectionFactory);
BitacoraService = new BitacoraService(
new BitacoraRepository(bitacoraDbExecutor),
new WebFormsBitacoraContextoProvider(UserContext));
UserRepository = new UserRepository(DbExecutor);
UserAdministrationRepository = new UserAdministrationRepository(DbExecutor);
UserAdministrationService = new UserAdministrationService(
UserAdministrationRepository,
PasswordHasher,
BitacoraService);
ServicioPerfilUsuario = new ServicioPerfilUsuario(
new RepositorioPerfilUsuario(DbExecutor),
PasswordHasher);
GeneralCatalogRepository = new GeneralCatalogRepository(DbExecutor);
ServicioProductoServicio = new ServicioProductoServicio(
new RepositorioProductoServicio(DbExecutor),
BitacoraService);
ServicioCatalogoProducto = new ServicioCatalogoProducto(
new RepositorioCatalogoProducto(DbExecutor),
BitacoraService);
ClienteDocumentoService = new ClienteDocumentoService(
new ClienteDocumentoRepository(DbExecutor));
ITramiteDocumentoRepository tramiteDocumentoRepository =
new TramiteDocumentoRepository(DbExecutor);
ITramiteDocumentoFileStore tramiteDocumentoFileStore =
new TramiteDocumentoFileStore();
TramiteDocumentoService = new TramiteDocumentoService(
tramiteDocumentoRepository,
tramiteDocumentoFileStore,
BitacoraService);
ITramiteSolicitudRepository tramiteSolicitudRepository =
new TramiteSolicitudRepository(DbExecutor);
ServicioFraccionamiento = new ServicioFraccionamiento(
new RepositorioFraccionamiento(DbExecutor),
tramiteSolicitudRepository,
BitacoraService);
IRepositorioGisFraccionamiento repositorioGis =
new RepositorioGisFraccionamiento(DbExecutor);
IAlmacenArchivosGisFraccionamiento almacenArchivosGis =
new AlmacenArchivosGisFraccionamiento();
ServicioGisFraccionamiento = new ServicioGisFraccionamiento(
repositorioGis,
almacenArchivosGis,
BitacoraService,
TramiteDocumentoService);
TramiteCatalogService = new TramiteCatalogService(
new TramiteCatalogRepository(DbExecutor),
BitacoraService);
TramiteSolicitudService = new TramiteSolicitudService(
tramiteSolicitudRepository,
BitacoraService);
var clienteProfact = new ClienteTimbradoPacProfact(
new ProveedorCredencialPacConfiguracion());
ServicioTimbradoCfdi = new ServicioTimbradoCfdi(
new RepositorioCfdi(DbExecutor),
new ConstructorXmlCfdi40Profact(),
new IClienteTimbradoPac[]
{
clienteProfact
},
new IClienteCancelacionPac[]
{
clienteProfact
},
new AlmacenArchivosCfdi());
ServicioVentaTramite = new ServicioVentaTramite(
new RepositorioVentaTramite(DbExecutor),
ServicioTimbradoCfdi);
LoginAttemptRepository = new LoginAttemptRepository(DbExecutor);
UserSessionRepository = new UserSessionRepository(DbExecutor);
IPermissionRepository permissionRepository =
new PermissionRepository(DbExecutor);
IMenuRepository menuRepository =
new MenuRepository(DbExecutor);
PermissionService = new PermissionService(
permissionRepository);
MenuProvider = new MenuProvider(menuRepository);
NotificationCenter = new DummyNotificationCenter();
SearchProvider = new DummyBuscadorCatalogoDataProvider();
LoginService = new LoginService(
UserRepository,
PasswordHasher,
LoginAttemptRepository,
UserSessionRepository);
PublicRegistrationService = new PublicRegistrationService(
UserAdministrationRepository,
GeneralCatalogRepository,
PasswordHasher,
new SmtpEmailSender());
}
private static string ReadSetting(
string appSettingName,
string environmentVariableName)
{
string environmentValue =
Environment.GetEnvironmentVariable(environmentVariableName);
return string.IsNullOrWhiteSpace(environmentValue)
? ConfigurationManager.AppSettings[appSettingName]
: environmentValue;
}
private static bool ReadBooleanSetting(
string appSettingName,
string environmentVariableName,
bool defaultValue)
{
bool value;
string configuredValue =
ReadSetting(appSettingName, environmentVariableName);
return bool.TryParse(configuredValue, out value)
? value
: defaultValue;
}
}
}

View File

@@ -46,16 +46,19 @@ namespace SIG.Web.AppCode.Configuration
"~/Metronic/assets/global/plugins/bootstrap-confirmation/bootstrap-confirmation.min.js",
"~/Metronic/assets/global/plugins/bootbox/bootbox.min.js",
"~/Metronic/assets/global/plugins/bootstrap-toastr/toastr.min.js",
"~/Metronic/assets/layouts/layout3/scripts/jquery.datetimepicker.full.min.js",
"~/Metronic/assets/global/scripts/metronic.js",
"~/Metronic/assets/admin/layout/scripts/layout.js",
"~/Metronic/assets/admin/layout/scripts/quick-sidebar.js",
"~/Metronic/assets/admin/layout/scripts/demo.js",
"~/Scripts/porcentaje-box.js",
"~/Scripts/BitacoraGrid.js",
"~/Scripts/DropdownGrid.js",
"~/Scripts/UcBuscadorCatalogo.js",
"~/Scripts/SigPdfViewer.js",
"~/Scripts/SigPdfDrawer.js",
"~/Scripts/custom.js"
"~/Scripts/custom.js",
"~/Scripts/sig-alerts.js"
));
bundles.Add(new ScriptBundle("~/bundles/WebFormsJs").Include(
@@ -108,18 +111,20 @@ namespace SIG.Web.AppCode.Configuration
.Include("~/Metronic/assets/global/plugins/simple-line-icons/simple-line-icons.min.css", new CssRewriteUrlTransform())
.Include(
"~/Styles/porcentaje-box.css",
"~/Styles/BitacoraGrid.css",
"~/Styles/DropdownGrid.css",
"~/Styles/UcBuscadorCatalogo.css",
"~/Styles/Filtros.css",
"~/Styles/SigPdfViewer.css",
"~/Styles/SigPdfDrawer.css",
"~/Styles/Estilos2.css",
"~/Metronic/assets/global/plugins/bootstrap-switch/css/bootstrap-switch.min.css",
"~/Metronic/assets/global/plugins/bootstrap-toastr/toastr.min.css",
"~/Metronic/assets/layouts/layout3/css/jquery.datetimepicker.css",
"~/Metronic/assets/global/plugins/select2/select2.css",
"~/Metronic/assets/global/css/components.css",
"~/Metronic/assets/global/css/plugins.css",
"~/Metronic/assets/admin/layout/css/layout.css",
"~/Metronic/assets/admin/layout/css/custom.css")
"~/Metronic/assets/admin/layout/css/layout.css")
.Include("~/Metronic/Carusel/slick.css", new CssRewriteUrlTransform())
.Include("~/Metronic/Carusel/slick-theme.css", new CssRewriteUrlTransform()));
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Data.SqlClient;
using System.Text;
using System.Web;
using SIG.Web.AppCode.Infrastructure;
using SIG.Web.AppCode.Services.Errors;
using SIG.Web.AppCode.Session;
@@ -51,9 +52,12 @@ namespace SIG.Web.AppCode.Configuration
/*
* El detalle t<EFBFBD>cnico completo siempre se guarda en log.
* Solo el administrador puede verlo en la respuesta.
* Solo el administrador o una solicitud local en depuracion
* puede verlo en la respuesta.
*/
bool mostrarDetalle = cveRole == 1;
bool mostrarDetalle =
cveRole == 1 ||
EsDepuracionLocal(context);
context.Server.ClearError();
@@ -114,6 +118,14 @@ namespace SIG.Web.AppCode.Configuration
return "Ocurri<72> un error inesperado.";
}
string controlledMessage =
ControlledExceptionClassifier.GetUserMessage(exception);
if (!string.IsNullOrWhiteSpace(controlledMessage))
{
return controlledMessage;
}
Exception baseException =
exception.GetBaseException();
@@ -274,6 +286,22 @@ namespace SIG.Web.AppCode.Configuration
context.ApplicationInstance.CompleteRequest();
}
private static bool EsDepuracionLocal(
HttpContext context)
{
try
{
return context != null &&
context.IsDebuggingEnabled &&
context.Request != null &&
context.Request.IsLocal;
}
catch
{
return false;
}
}
private static UserSessionModel ObtenerUsuarioActual()
{
try

View File

@@ -0,0 +1,9 @@
using SIG.Web.AppCode.Models.Bitacora;
namespace SIG.Web.AppCode.Contracts.Bitacora
{
public interface IBitacoraContextoProvider
{
BitacoraContextoModel Obtener();
}
}

View File

@@ -0,0 +1,25 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Bitacora;
using SIG.Web.AppCode.Models.Common;
namespace SIG.Web.AppCode.Contracts.Bitacora
{
public interface IBitacoraRepository
{
DbResult<long> Agregar(
BitacoraEventoModel evento,
BitacoraContextoModel contexto);
DbResult<List<BitacoraModel>> Listar(
BitacoraFiltroModel filtro,
int cveUsuarioEjecuta);
DbResult<ResultadoPaginado<BitacoraModel>> ConsultarResumen(
BitacoraConsultaModel consulta,
int cveUsuarioEjecuta);
DbResult<BitacoraModel> ConsultarDetalle(
long cveBitacora,
int cveUsuarioEjecuta);
}
}

View File

@@ -0,0 +1,18 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Bitacora;
using SIG.Web.AppCode.Models.Common;
namespace SIG.Web.AppCode.Contracts.Bitacora
{
public interface IBitacoraService
{
DbResult<long> Registrar(BitacoraEventoModel evento);
DbResult<List<BitacoraModel>> Listar(BitacoraFiltroModel filtro);
DbResult<ResultadoPaginado<BitacoraModel>> ConsultarResumen(
BitacoraConsultaModel consulta);
DbResult<BitacoraModel> ConsultarDetalle(long cveBitacora);
}
}

View File

@@ -0,0 +1,13 @@
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Documentos;
namespace SIG.Web.AppCode.Contracts.Documentos
{
public interface IClienteDocumentoRepository
{
DbResult<ClienteDocumentoEtapaContextoModel> GetStageContext(
int stageId,
int executingUser,
string domainName);
}
}

View File

@@ -0,0 +1,28 @@
using System.IO;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Documentos;
namespace SIG.Web.AppCode.Contracts.Documentos
{
public interface IClienteDocumentoService
{
DbResult<ClienteDocumentoEtapaContextoModel> GetStageContext(
int stageId,
int executingUser,
string domainName);
DbResult<ClienteDocumentoArchivoModel> SaveStageGis(
int developmentId,
int stageId,
string originalFileName,
Stream content,
long contentLength,
int executingUser,
string domainName);
DbResult<ClienteDocumentoArchivoModel> GetStageGis(
int stageId,
int executingUser,
string domainName);
}
}

View File

@@ -0,0 +1,18 @@
using System.IO;
using SIG.Web.AppCode.Models.Documentos;
namespace SIG.Web.AppCode.Contracts.Documentos
{
public interface ITramiteDocumentoFileStore
{
TramiteDocumentoPreparedFile Prepare(
TramiteDocumentoUploadContextModel context,
Stream source,
string previousRelativePath);
void Promote(TramiteDocumentoPreparedFile preparedFile);
void Rollback(TramiteDocumentoPreparedFile preparedFile);
void Complete(TramiteDocumentoPreparedFile preparedFile);
Stream OpenRead(string relativePath);
}
}

View File

@@ -0,0 +1,63 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Documentos;
namespace SIG.Web.AppCode.Contracts.Documentos
{
public interface ITramiteDocumentoRepository
{
DbResult<List<TramiteDocumentoSolicitudModel>> ListForDevelopment(
int developmentId,
int? stageId,
int? procedureTypeId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoUploadContextModel> GetUploadContext(
int developmentId,
int requestId,
int documentTypeId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoUploadContextModel> GetStageUploadContext(
int stageId,
int procedureTypeId,
int documentTypeId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoSaveResultModel> SaveUpload(
int developmentId,
int requestId,
int documentTypeId,
string originalFileName,
string physicalFileName,
string relativePath,
string contentType,
long contentLength,
string clientComment,
int executingUser,
string domainName);
DbResult<TramiteDocumentoReviewResultModel> Review(
int developmentId,
int documentRequestId,
bool approved,
string note,
int executingUser,
string domainName);
DbResult<TramiteDocumentoDownloadContextModel> GetDownloadContext(
int developmentId,
int documentRequestId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoDeleteResultModel> Delete(
int developmentId,
int documentRequestId,
int executingUser,
string domainName);
}
}

View File

@@ -0,0 +1,69 @@
using System.Collections.Generic;
using System.IO;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Documentos;
namespace SIG.Web.AppCode.Contracts.Documentos
{
public interface ITramiteDocumentoService
{
DbResult<List<TramiteDocumentoSolicitudModel>> ListForDevelopment(
int developmentId,
int? stageId,
int? procedureTypeId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoUploadContextModel> GetUploadContext(
int developmentId,
int requestId,
int documentTypeId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoSaveResultModel> Upload(
int developmentId,
int requestId,
int documentTypeId,
string originalFileName,
string contentType,
Stream content,
long contentLength,
string clientComment,
int executingUser,
string domainName);
DbResult<TramiteDocumentoReviewResultModel> Review(
int developmentId,
int documentRequestId,
bool approved,
string note,
int executingUser,
string domainName);
DbResult<TramiteDocumentoFileModel> Open(
int developmentId,
int documentRequestId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoSaveResultModel> RegisterExternalStageFile(
int stageId,
int procedureTypeId,
int documentTypeId,
string originalFileName,
string physicalFileName,
string relativePath,
string contentType,
long contentLength,
int executingUser,
string domainName);
DbResult<bool> RemoveExternalStageFile(
int stageId,
int procedureTypeId,
int documentTypeId,
int executingUser,
string domainName);
}
}

View File

@@ -0,0 +1,142 @@
using System;
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Facturacion;
namespace SIG.Web.AppCode.Contracts.Facturacion
{
public interface IRepositorioCfdi
{
DbResult<ModeloEmisorFiscalCfdi> ObtenerEmisor(
int cveEmpresa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloReceptorFiscalCfdi> ObtenerReceptor(
int cveCliente,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<long> GuardarBorrador(
ModeloDocumentoCfdi documento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloDocumentoCfdi> ObtenerDocumento(
long cveCfdiDocumento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloInicioTimbradoCfdi> IniciarIntento(
long cveCfdiDocumento,
Guid idSolicitud,
string proveedorPac,
string ambiente,
string referenciaContratoPac,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloIntentoTimbradoCfdi> FinalizarIntento(
long cveCfdiTimbrado,
ModeloResultadoPacCfdi resultadoPac,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<ModeloIntentoTimbradoCfdi>> ListarIntentos(
long cveCfdiDocumento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloArchivoCfdi> ObtenerXml(
long cveCfdiDocumento,
bool timbrado,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloInicioCancelacionCfdi> IniciarCancelacion(
ModeloSolicitudCancelacionCfdi solicitud,
Guid idSolicitud,
string proveedorPac,
string ambiente,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloResultadoCancelacionCfdi> FinalizarCancelacion(
long cveCfdiCancelacion,
ModeloResultadoCancelacionPacCfdi resultadoPac,
int cveUsuarioEjecuta,
string nombreDominio);
}
public interface IConstructorXmlCfdi
{
DbResult<ModeloResultadoConstruccionXmlCfdi> Construir(
ModeloSolicitudCfdi solicitud,
ModeloEmisorFiscalCfdi emisor,
ModeloReceptorFiscalCfdi receptor);
}
public interface IClienteTimbradoPac
{
string Proveedor { get; }
ModeloResultadoPacCfdi Timbrar(
ModeloSolicitudPacCfdi solicitud);
}
public interface IClienteCancelacionPac
{
string Proveedor { get; }
ModeloResultadoCancelacionPacCfdi Cancelar(
ModeloSolicitudCancelacionPacCfdi solicitud);
}
public interface IProveedorCredencialPac
{
string ObtenerCredencial(string referencia);
}
public interface IAlmacenArchivosCfdi
{
DbResult<string> GuardarXmlTimbrado(
ModeloDocumentoCfdi documento,
ModeloIntentoTimbradoCfdi intento);
}
public interface IServicioTimbradoCfdi
{
DbResult<long> GuardarBorrador(
ModeloSolicitudCfdi solicitud,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloResultadoTimbradoCfdi> Timbrar(
long cveCfdiDocumento,
Guid? idSolicitud,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloDocumentoCfdi> ObtenerDocumento(
long cveCfdiDocumento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<ModeloIntentoTimbradoCfdi>> ListarIntentos(
long cveCfdiDocumento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloArchivoCfdi> ObtenerXml(
long cveCfdiDocumento,
bool timbrado,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloResultadoCancelacionCfdi> Cancelar(
ModeloSolicitudCancelacionCfdi solicitud,
Guid? idSolicitud,
int cveUsuarioEjecuta,
string nombreDominio);
}
}

View File

@@ -0,0 +1,14 @@
using System.IO;
using SIG.Web.AppCode.Models.Fraccionamientos;
namespace SIG.Web.AppCode.Contracts.Fraccionamientos
{
public interface IAlmacenArchivosGisFraccionamiento
{
string ObtenerRutaFisica(ContextoGisFraccionamiento contexto);
bool Existe(ContextoGisFraccionamiento contexto);
void Guardar(ContextoGisFraccionamiento contexto, Stream origen);
Stream AbrirLectura(ContextoGisFraccionamiento contexto);
void Eliminar(ContextoGisFraccionamiento contexto);
}
}

View File

@@ -0,0 +1,83 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Fraccionamientos;
namespace SIG.Web.AppCode.Contracts.Fraccionamientos
{
public interface IRepositorioFraccionamiento
{
DbResult<List<OpcionClienteFraccionamiento>> ListarClientes(int cveUsuarioEjecuta, string nombreDominio);
DbResult<List<OpcionEstatusFraccionamiento>> ListarEstatus(int cveUsuarioEjecuta, string nombreDominio);
DbResult<List<ModeloFraccionamiento>> Listar(string texto, int? cveCliente, bool incluirInactivo, int cveUsuarioEjecuta, string nombreDominio);
DbResult<ModeloFraccionamiento> Obtener(int cveFraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
DbResult<List<ModeloAvisoDetalleFraccionamiento>> ObtenerAvisosDetalle(
int cveFraccionamiento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> Guardar(ModeloFraccionamiento fraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
DbResult<bool> Eliminar(int cveFraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
DbResult<List<ModeloEtapaFraccionamiento>> ListarEtapas(int cveFraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
DbResult<ModeloEtapaFraccionamiento> ObtenerEtapa(int cveFraccionamientoEtapa, int cveUsuarioEjecuta, string nombreDominio);
DbResult<ResultadoAvanceEtapaFraccionamiento> ActualizarAvanceEtapa(
int cveFraccionamientoEtapa,
decimal avance,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloCondicionesEtapaFraccionamiento> ObtenerCondicionesEtapa(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloCondicionesEtapaFraccionamiento> GuardarCondicionesEtapa(
ModeloCondicionesEtapaFraccionamiento condiciones,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloGisEtapaFraccionamiento> ObtenerGisEtapa(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloGisEtapaFraccionamiento> GuardarGisEtapa(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<ModeloTramiteEtapaFraccionamiento>> ListarTramitesEtapa(int cveFraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
DbResult<int> GuardarEtapa(ModeloEtapaFraccionamiento etapa, int cveUsuarioEjecuta, string nombreDominio);
DbResult<bool> MoverOrdenEtapa(
int cveFraccionamientoEtapa,
int cveFraccionamientoEtapaReferencia,
bool colocarDespues,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<bool> EliminarEtapa(int cveFraccionamientoEtapa, int cveUsuarioEjecuta, string nombreDominio);
DbResult<List<ModeloLoteFraccionamiento>> ListarLotes(
int cveFraccionamiento,
int? cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloLoteFraccionamiento> ObtenerLote(
int cveFraccionamiento,
int cveFraccionamientoLote,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> GuardarLote(
int cveFraccionamiento,
ModeloLoteFraccionamiento lote,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<ModeloLoteFraccionamiento>> GuardarLotes(
int cveFraccionamiento,
int cveFraccionamientoEtapa,
IList<ModeloLoteFraccionamiento> lotes,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<bool> EliminarLote(
int cveFraccionamiento,
int cveFraccionamientoLote,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> LimpiarLotesEtapa(
int cveFraccionamiento,
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
}
}

View File

@@ -0,0 +1,30 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Fraccionamientos;
namespace SIG.Web.AppCode.Contracts.Fraccionamientos
{
public interface IRepositorioGisFraccionamiento
{
DbResult<ContextoGisFraccionamiento> ObtenerContexto(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<VinculoLoteGisFraccionamiento>> ListarVinculos(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<bool> GuardarVinculos(
int cveFraccionamientoEtapa,
IList<VinculoLoteGisFraccionamiento> vinculos,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<bool> LimpiarVinculos(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
}
}

View File

@@ -0,0 +1,86 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Fraccionamientos;
namespace SIG.Web.AppCode.Contracts.Fraccionamientos
{
public interface IServicioFraccionamiento
{
DbResult<List<OpcionClienteFraccionamiento>> ListarClientes(int cveUsuarioEjecuta, string nombreDominio);
DbResult<List<OpcionEstatusFraccionamiento>> ListarEstatus(int cveUsuarioEjecuta, string nombreDominio);
DbResult<List<ModeloFraccionamiento>> Listar(string texto, int? cveCliente, bool incluirInactivo, int cveUsuarioEjecuta, string nombreDominio);
DbResult<ModeloFraccionamiento> Obtener(int cveFraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
DbResult<List<ModeloAvisoDetalleFraccionamiento>> ObtenerAvisosDetalle(
int cveFraccionamiento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> Guardar(ModeloFraccionamiento fraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
DbResult<bool> Eliminar(int cveFraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
DbResult<List<ModeloEtapaFraccionamiento>> ListarEtapas(int cveFraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
DbResult<ModeloEtapaFraccionamiento> ObtenerEtapa(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ResultadoAvanceEtapaFraccionamiento> ActualizarAvanceEtapa(
int cveFraccionamientoEtapa,
decimal avance,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloCondicionesEtapaFraccionamiento> ObtenerCondicionesEtapa(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloCondicionesEtapaFraccionamiento> GuardarCondicionesEtapa(
ModeloCondicionesEtapaFraccionamiento condiciones,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloGisEtapaFraccionamiento> ObtenerGisEtapa(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloGisEtapaFraccionamiento> GuardarGisEtapa(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<ModeloTramiteEtapaFraccionamiento>> ListarTramitesEtapa(int cveFraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
DbResult<int> GuardarEtapa(ModeloEtapaFraccionamiento etapa, int cveUsuarioEjecuta, string nombreDominio);
DbResult<bool> MoverOrdenEtapa(
int cveFraccionamientoEtapa,
int cveFraccionamientoEtapaReferencia,
bool colocarDespues,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<bool> EliminarEtapa(int cveFraccionamientoEtapa, int cveUsuarioEjecuta, string nombreDominio);
DbResult<List<ModeloLoteFraccionamiento>> ListarLotes(
int cveFraccionamiento,
int? cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloLoteFraccionamiento> ObtenerLote(
int cveFraccionamiento,
int cveFraccionamientoLote,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> GuardarLote(
int cveFraccionamiento,
ModeloLoteFraccionamiento lote,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> GuardarLotes(
int cveFraccionamiento,
int cveFraccionamientoEtapa,
IList<ModeloLoteFraccionamiento> lotes,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<bool> EliminarLote(
int cveFraccionamiento,
int cveFraccionamientoLote,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> LimpiarLotesEtapa(
int cveFraccionamiento,
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
}
}

View File

@@ -0,0 +1,34 @@
using System.Collections.Generic;
using System.IO;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Fraccionamientos;
namespace SIG.Web.AppCode.Contracts.Fraccionamientos
{
public interface IServicioGisFraccionamiento
{
DbResult<VistaGisFraccionamiento> Obtener(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ResultadoGuardadoGisFraccionamiento> Guardar(
int cveFraccionamientoEtapa,
string nombreArchivoOriginal,
Stream contenido,
long longitudContenido,
IList<VinculoLoteGisFraccionamiento> vinculos,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ResultadoGuardadoGisFraccionamiento> Eliminar(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ArchivoGisFraccionamiento> AbrirArchivo(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
}
}

View File

@@ -0,0 +1,12 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.General;
namespace SIG.Web.AppCode.Contracts.General
{
public interface IGeneralCatalogRepository
{
DbResult<List<StateOptionModel>> ListStates(string domainName);
DbResult<PostalCodeLookupModel> GetPostalCode(string postalCode, string domainName);
}
}

View File

@@ -0,0 +1,51 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.General;
namespace SIG.Web.AppCode.Contracts.General
{
public interface IRepositorioCatalogoProducto
{
DbResult<List<ModeloClasificacion>> ListarClasificaciones(
string texto,
bool incluirInactivos,
int usuario,
string dominio);
DbResult<ModeloClasificacion> ObtenerClasificacion(
int cveClasificacion,
int usuario,
string dominio);
DbResult<int> GuardarClasificacion(
ModeloClasificacion clasificacion,
int usuario,
string dominio);
DbResult<bool> EliminarClasificacion(
int cveClasificacion,
int usuario,
string dominio);
DbResult<List<ModeloUnidadMedida>> ListarUnidadesMedida(
string texto,
bool incluirInactivos,
int usuario,
string dominio);
DbResult<ModeloUnidadMedida> ObtenerUnidadMedida(
int cveUnidadMedida,
int usuario,
string dominio);
DbResult<int> GuardarUnidadMedida(
ModeloUnidadMedida unidadMedida,
int usuario,
string dominio);
DbResult<bool> EliminarUnidadMedida(
int cveUnidadMedida,
int usuario,
string dominio);
}
}

View File

@@ -0,0 +1,36 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.General;
namespace SIG.Web.AppCode.Contracts.General
{
public interface IRepositorioProductoServicio
{
DbResult<List<ModeloProductoServicio>> Listar(
string texto,
bool incluirInactivos,
int usuario,
string dominio);
DbResult<ModeloProductoServicio> Obtener(
int cvePS,
int usuario,
string dominio);
DbResult<ModeloOpcionesProductoServicio> ListarOpciones(
int? cveClasificacionActual,
int? cveUnidadMedidaActual,
int usuario,
string dominio);
DbResult<int> Guardar(
ModeloProductoServicio productoServicio,
int usuario,
string dominio);
DbResult<bool> Eliminar(
int cvePS,
int usuario,
string dominio);
}
}

View File

@@ -0,0 +1,51 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.General;
namespace SIG.Web.AppCode.Contracts.General
{
public interface IServicioCatalogoProducto
{
DbResult<List<ModeloClasificacion>> ListarClasificaciones(
string texto,
bool incluirInactivos,
int usuario,
string dominio);
DbResult<ModeloClasificacion> ObtenerClasificacion(
int cveClasificacion,
int usuario,
string dominio);
DbResult<int> GuardarClasificacion(
ModeloClasificacion clasificacion,
int usuario,
string dominio);
DbResult<bool> EliminarClasificacion(
int cveClasificacion,
int usuario,
string dominio);
DbResult<List<ModeloUnidadMedida>> ListarUnidadesMedida(
string texto,
bool incluirInactivos,
int usuario,
string dominio);
DbResult<ModeloUnidadMedida> ObtenerUnidadMedida(
int cveUnidadMedida,
int usuario,
string dominio);
DbResult<int> GuardarUnidadMedida(
ModeloUnidadMedida unidadMedida,
int usuario,
string dominio);
DbResult<bool> EliminarUnidadMedida(
int cveUnidadMedida,
int usuario,
string dominio);
}
}

View File

@@ -0,0 +1,36 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.General;
namespace SIG.Web.AppCode.Contracts.General
{
public interface IServicioProductoServicio
{
DbResult<List<ModeloProductoServicio>> Listar(
string texto,
bool incluirInactivos,
int usuario,
string dominio);
DbResult<ModeloProductoServicio> Obtener(
int cvePS,
int usuario,
string dominio);
DbResult<ModeloOpcionesProductoServicio> ListarOpciones(
int? cveClasificacionActual,
int? cveUnidadMedidaActual,
int usuario,
string dominio);
DbResult<int> Guardar(
ModeloProductoServicio productoServicio,
int usuario,
string dominio);
DbResult<bool> Eliminar(
int cvePS,
int usuario,
string dominio);
}
}

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